{"version":3,"file":"app.dc780461792238108708.js","mappings":"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","sources":["webpack://perrla-word/webpack/runtime/chunk loaded","webpack://perrla-word/webpack/runtime/load script","webpack://perrla-word/./src/config/enums.js","webpack://perrla-word/./src/config.js","webpack://perrla-word/./src/helpers/get-reference-format-id.js","webpack://perrla-word/./src/helpers/word-document-props.js","webpack://perrla-word/./src/App.vue","webpack://perrla-word/./src/components/Loader.vue","webpack://perrla-word/src/components/Loader.vue","webpack://perrla-word/./src/components/Loader.vue?4ace","webpack://perrla-word/./src/components/Loader.vue?5508","webpack://perrla-word/./src/components/SideMenu.vue","webpack://perrla-word/src/components/SideMenu.vue","webpack://perrla-word/./src/components/SideMenu.vue?b4fe","webpack://perrla-word/./src/components/SideMenu.vue?034f","webpack://perrla-word/./src/components/Toaster.vue","webpack://perrla-word/src/components/Toaster.vue","webpack://perrla-word/./src/components/Toaster.vue?fa46","webpack://perrla-word/./src/components/Toaster.vue?4fb5","webpack://perrla-word/src/App.vue","webpack://perrla-word/./src/services/app/api/logBrowser.js","webpack://perrla-word/./src/App.vue?5576","webpack://perrla-word/./src/App.vue?f581","webpack://perrla-word/./src/index.js","webpack://perrla-word/./src/router/modules/cart.js","webpack://perrla-word/./src/router/documentCreates.js","webpack://perrla-word/./src/router/reference.js","webpack://perrla-word/./src/router/index.js","webpack://perrla-word/./src/services/app/api/makeCall.js","webpack://perrla-word/./src/services/app/checkToken.js","webpack://perrla-word/./src/services/app/fullLogout.js","webpack://perrla-word/./src/services/app/initTooltips.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Advertisement.js","webpack://perrla-word/./src/services/reference/APA7/APA7-AncientClassicWork.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Anthology.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Apparatus.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Artwork.js","webpack://perrla-word/./src/services/reference/APA7/APA7-BillsResolutions.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Blog.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Book.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Brochures.js","webpack://perrla-word/./src/services/reference/APA7/APA7-ChartsMaps.js","webpack://perrla-word/./src/services/reference/APA7/APA7-ConferenceMaterials.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Constitutions.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Datasets.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Dissertations.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Engine.js","webpack://perrla-word/./src/services/reference/APA7/APA7-ExecutiveOrders.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Films.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Grants.js","webpack://perrla-word/./src/services/reference/APA7/APA7-GrayLiterature.js","webpack://perrla-word/./src/services/reference/APA7/APA7-InformalWorks.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Interview.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Journal.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Lectures.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Magazine.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Manuscript.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Music.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Newspaper.js","webpack://perrla-word/./src/services/reference/APA7/APA7-OnlineComment.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Patent.js","webpack://perrla-word/./src/services/reference/APA7/APA7-PersonalCommunication.js","webpack://perrla-word/./src/services/reference/APA7/APA7-PodcastsRadio.js","webpack://perrla-word/./src/services/reference/APA7/APA7-PressRelease.js","webpack://perrla-word/./src/services/reference/APA7/APA7-ReferenceWorks.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Regulations.js","webpack://perrla-word/./src/services/reference/APA7/APA7-ReligiousWork.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Reviews.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Shared.js","webpack://perrla-word/./src/services/reference/APA7/APA7-SocialMedia.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Software.js","webpack://perrla-word/./src/services/reference/APA7/APA7-SpecialRules.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Speech.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Statutes.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Television.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Testimonies.js","webpack://perrla-word/./src/services/reference/APA7/APA7-TestsScales.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Treaties.js","webpack://perrla-word/./src/services/reference/APA7/APA7-USFederalCourtCases.js","webpack://perrla-word/./src/services/reference/APA7/APA7-USStateCourtCases.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Videos.js","webpack://perrla-word/./src/services/reference/APA7/APA7-Webpage.js","webpack://perrla-word/./src/services/reference/Engine.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Advertisement.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-AncientClassicWork.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Anthology.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Apparatus.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Artwork.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-BillsResolutions.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Blog.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Book.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Brochures.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-ChartsMaps.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-ConferenceMaterials.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Constitutions.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Datasets.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Dissertations.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Engine.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-ExecutiveOrders.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Films.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Grants.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-GrayLiterature.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-InformalWorks.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Interview.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Journal.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Lectures.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Magazine.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Manuscript.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Music.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Newspaper.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-OnlineComment.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Patent.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-PersonalCommunication.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-PodcastsRadio.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-PressRelease.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-ReferenceWorks.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Regulations.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-ReligiousWork.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Reviews.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Shared.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-SocialMedia.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Software.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-SpecialRules.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Speech.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Statutes.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Television.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Testimonies.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-TestsScales.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Treaties.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-USFederalCourtCases.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-USStateCourtCases.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Videos.js","webpack://perrla-word/./src/services/reference/MLA9/MLA9-Webpage.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Advertisement.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-AncientClassicWork.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Anthology.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Apparatus.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Artwork.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-BillsResolutions.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Blog.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Book.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Brochures.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-ChartsMaps.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-ConferenceMaterials.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Constitutions.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Datasets.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Dissertations.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Engine.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-ExecutiveOrders.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Films.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Grants.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-GrayLiterature.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-InformalWorks.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Interview.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Journal.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Lectures.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Magazine.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Manuscript.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Music.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Newspaper.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-OnlineComment.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Patent.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-PersonalCommunication.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-PodcastsRadio.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-PressRelease.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-ReferenceWorks.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Regulations.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-ReligiousWork.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Reviews.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Shared.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-SocialMedia.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Software.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-SpecialRules.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Speech.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Statutes.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Television.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Testimonies.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-TestsScales.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Treaties.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-USFederalCourtCases.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-USStateCourtCases.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Videos.js","webpack://perrla-word/./src/services/reference/Turabian9/Turabian9-Webpage.js","webpack://perrla-word/./src/services/reference/dateHelper.js","webpack://perrla-word/./src/services/reference/stringHelper.js","webpack://perrla-word/./src/store/modules/api.js","webpack://perrla-word/./src/store/modules/cart.js","webpack://perrla-word/./src/store/modules/classes.js","webpack://perrla-word/./src/store/modules/customer.js","webpack://perrla-word/./src/store/modules/forms.js","webpack://perrla-word/./src/store/modules/freeTrial.js","webpack://perrla-word/./src/store/modules/gridSorts.js","webpack://perrla-word/./src/store/modules/loaders.js","webpack://perrla-word/./src/store/modules/references.js","webpack://perrla-word/./src/store/modules/referenceDuplicate.js","webpack://perrla-word/./src/store/modules/referenceRules.js","webpack://perrla-word/./src/store/modules/researchNotes.js","webpack://perrla-word/./src/store/modules/thirdPartyLookup.js","webpack://perrla-word/./src/store/index.js","webpack://perrla-word/./src/services/reference/APA7/ sync ^\\.\\/APA7\\-.*\\.js$","webpack://perrla-word/./src/services/reference/MLA9/ sync ^\\.\\/MLA9\\-.*\\.js$","webpack://perrla-word/./src/services/reference/Turabian9/ sync ^\\.\\/Turabian9\\-.*\\.js$","webpack://perrla-word/webpack/bootstrap","webpack://perrla-word/webpack/runtime/compat get default export","webpack://perrla-word/webpack/runtime/define property getters","webpack://perrla-word/webpack/runtime/ensure chunk","webpack://perrla-word/webpack/runtime/get javascript chunk filename","webpack://perrla-word/webpack/runtime/get mini-css chunk filename","webpack://perrla-word/webpack/runtime/global","webpack://perrla-word/webpack/runtime/hasOwnProperty shorthand","webpack://perrla-word/webpack/runtime/make namespace object","webpack://perrla-word/webpack/runtime/node module decorator","webpack://perrla-word/webpack/runtime/publicPath","webpack://perrla-word/webpack/runtime/css loading","webpack://perrla-word/webpack/runtime/jsonp chunk loading","webpack://perrla-word/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"perrla-word:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","/*\n- Config > Enums \n-- this is for all platforms, so don't delete here unless you check all the all first\n-- 2024.08.21\n*/\n\nexport default {\n\tAccountRole:{\n\t\t0: 'Not Started',\n\t\t1: 'Free Trial',\n\t\t2: 'Full Access',\n\t},\n\tAddFromLibraryMode:{\n\t\t'COMMING_SOON': 6,\t// for ref types that are building soon\n\t\t'DISABLED': 2,\n\t\t'FORMAT_DISABLED': 7,\t// in MLA9 paper but there isn't an MLA9 Reference Value \n\t\t'GIMMICK': 5,\t\t// fake one i made for testing \n\t\t'NEVERMIND': 8,\t\t// used for a duplicate reference the user is trying to create outside of Paper Edit (user can't add a ref to a paper)\n\t\t'NORMAL': 3,\t\n\t\t'REVIEW': 4,\t\t// for a ref type that is missing information\n\t\t'UPDATE': 1,\t\t// older ref type\n\t},\n\tCartPaymentType:{\n\t\t'CARD': 1,\n\t\t'ECHECK': 2,\n\t},\n\tCitationTab: {\t\t// for turabian9 onlye\n\t\t'CITATION': 1,\n\t\t'FOOTNOTE': 0,\n\t},\n\tCkEditorType:{\n\t\t'ABSTRACT': 0,\n\t\t'ANNOTATION': 1,\n\t\t'APPENDIX': 4,\n\t\t'AUTHORS_NOTE': 2,\n\t\t'BODY': 3,\n\t\t'FOOTNOTES': 6,\n\t\t'OUTLINE': 5,\n\t},\n\tClassColors:{\n\t\t// https://magical-scratch.webflow.io/\n\t\t'NONE': {\n\t\t\t'block': 'adb5bd',\t//$gray-500\n\t\t\t'darkText': 'e9ecef',\t// $dark-body-color\n\t\t\t'text': '495057',\t//$gray-700\n\t\t\t'map':\t['bbbbbb', '666666', 'bb00bb', '660066'],\n\t\t},\n\t\t'RED': {\n\t\t\t'block': 'f28c79',\n\t\t\t'darkText': 'f28c79', //ff3f67\n\t\t\t'text': '9a122c',\n\t\t\t'map':\t['bb0000', '660000', 'bb5500', '885500'],\n\t\t},\n\t\t'YELLOW': {\n\t\t\t'block': 'ffd266',\n\t\t\t'darkText': 'ffd266', //d37500\n\t\t\t'text': 'b76600',\n\t\t\t'map':\t['bbbb00', '666600'],\n\t\t},\n\t\t'GREEN': {\n\t\t\t'block': '8ddb7a',\n\t\t\t'darkText': '8ddb7a', //12611d\n\t\t\t'text': '12611d',\n\t\t\t'map':\t['00bb00', '006600'],\t\t\t\t\n\t\t},\n\t\t'TEAL': {\n\t\t\t'block': '80deea',\n\t\t\t'darkText': '71d5e2', // 009dac\n\t\t\t'text': '00838f',\n\t\t\t'map':\t['00bbbb', '006666'],\n\t\t},\n\t\t'BLUE': {\n\t\t\t'block': '62baf5',\n\t\t\t'darkText': '62baf5', // 008cff\n\t\t\t'text': '0040a1',\n\t\t\t'map':\t['0000bb', '000066'],\n\t\t},\n\t},\n\tDocumentType:{\n\t\t'ANNOTATED_BIBLIOGRAPHY' : 1,\n\t\t'DISCUSSION_POST': 2,\n\t\t'REFERENCE_LIST': 3,\n\t\t'RESEARCH_PAPER': 4,\n\t},\n\tDownloadPaperContentType:{\n\t\t'WORD': 1,\n\t\t'WORD_SIMPLE': 2,\n\t\t'PDF': 3,\n\t\t'HTML': 4,\n\t\t'COMPRESSED': 5,\n\t},\n\tEntity:{\n\t\t'ASSIGNMENT': 3,\n\t\t'CLASS': 2,\n\t\t'PAPER': 1,\n\t\t'REFERENCE': 7,\n\t\t'REMINDER': 5,\n\t\t'TODO': 4,\n\t},\n\tError:{\n\t\t'INSERT_IN_CONTENT_CONTROL': 1,\n\t},\n\tFontFamily:{\n\t\t'ARIAL': 1,\n\t\t'COURIER': 2,\n\t\t'TIMES_NEW_ROMAN': 3,\n\t\t'TREBUCHET': 4,\n\t\t'VERDANA': 5,\n\t},\n\tFormat: {\n\t\t'APA6': 2,\n\t\t'APA7': 7,\n\t\t'MLA8': 6,\n\t\t'MLA9': 8,\n\t\t'Turabian9' : 9\n\t},\n\tLayout: {\n\t\t'CART': 3,\n\t\t'PO': 0,\n\t\t'PCOM': 1,\n\t\t'SIMPLE': 2,\t// same as PCOM without a header or footer\n\t},\n\tModule:{\n\t\t'DASHBOARD': 0,\n\t\t'PAPER_EDIT': 1,\n\t\t'PAPER_LIST': 2,\n\t\t'REFERENCE_EDIT': 3,\n\t\t'REFERENCE_LIST': 4,\n\t\t'REMINDER_LIST': 5,\n\t},\n\tModuleOrigin:{\n\t\t'REFERENCES': 0,\n\t\t'RESEARCH_NOTES': 1,\n\t},\n\tPaperType: {\n\t\t'APA_DiscussionPost': 2,\n\t\t'APA_ResearchPaper': 1,\n\n\t\t'APA7_AnnotatedBibliography' : 15,\n\t\t'APA7_DiscussionPost': 13,\n\t\t'APA7_ProfessionalPaper': 12,\n\t\t'APA7_ReferenceList' : 14,\n\t\t'APA7_StudentPaper': 11,\n\n\t\t'MLA_DiscussionPost': 102,\n\t\t'MLA_ResearchPaper': 101,\n\t\t\n\t\t'MLA9_AnnotatedBibliography' : 114,\n\t\t'MLA9_DiscussionPost': 112,\n\t\t'MLA9_ReferenceList' : 113,\n\t\t'MLA9_ResearchPaper': 111,\n\n\t\t'Turabian9_AnnotatedBibliography' : 214,\n\t\t'Turabian9_DiscussionPost': 212,\n\t\t'Turabian9_ReferenceList' : 213,\n\t\t'Turabian9_ResearchPaper': 211,\n\t},\n\tPlatform:{\n\t\t'ADD_IN': 6,\n\t\t'ONLINE': 7,\n\t\t'CHROME_EXT': 8,\n\t},\n\tRefTypeTab: {\n\t\t'Common': 0,\n\t\t'All': 1,\n\t\t// 'Recent': 4,\n\t},\n\tResearchNotesSortBy:{\n\t\t'CITATION_FIRST_TO_LAST': 2,\n\t\t'CITATION_LAST_TO_FIRST': 3,\n\t\t'CREATED_DATE_NEWEST_FIRST': 0,\n\t\t'CREATED_DATE_OLDEST_FIRST': 1,\n\t},\n\tStatus: {\n\t\t'FREE_TRIAL': 1,\n\t\t'FULL_ACCESS': 2,\n\t\t'NOT_STARTED': 0\n\t},\n\tSubscriptionPeriod:{\n\t\t0: 'None',\n\t\t1: 'Monthly',\n\t\t2: 'Annual',\n\t},\n\tSubscriptionRenewalPeriod:{\n\t\t'ANNUAL': 2,\n\t\t// 'MONTH': 1,\n\t\t// 'NONE': 0,\n\t\t'SEMI': 3,\n\t},\n\tSubscriptionRenewalType:{\n\t\t'AUTO': 1,\n\t\t'MANUAL': 2,\n\t},\n\tTab:{\n\t\t'_': 0,\n\t\t'CITATIONS': 1,\n\t\t'DETAILS': 2,\n\t\t'EDITOR': 3,\n\t\t'OUTLINE': 4,\n\t\t'PAPERS': 5,\n\t\t'RESEARCH': 6,\n\t},\n\tTheme:{\n\t\t'DARK': 2,\n\t\t'REGULAR': 1,\n\t\t'SERRENA': 3,\n\t},\n\tURL_TO_ENV:{\n\t\t'PERRLA': 1,\n\t\t'PERRLA_COMPLETE': 2,\n\t},\n\tValidation:{\n\t\t'NONE': 0,\t// not used but keep here so i know 0 is the default none\n\t\t'DATE': 6,\n\t\t'EMAIL': 1,\n\t\t'EMAIL_REQUIRED': 2,\n\t\t'NUMERIC': 3,\n\t\t'NUMERIC_REQUIRED': 4,\n\t\t'REQUIRED': 5,\n\t},\n\tWorkType:{\n\t\t'ASSIGNMENT': 2,\n\t\t'TODO': 1,\n\t},\n}","import enums from '../src/config/enums';\n\n// env detection (only one should be true)\nlet isDev = false;\nlet isTest = false;\nlet isLive = false;\n\n// set app level url \nlet appUrl = window.location.origin;\n\nif(appUrl.includes('localhost')){ \n\t// Dev\n\tisDev = true;\n} else if(appUrl.includes('testword')){\n\t// Test\n\tisTest = true;\n} else {\n\t// Live ?\n\tisLive = true;\n}\n\n// store todays' date so i won't have to calculate it every time\nlet todayDate = new Date();\ntodayDate.setHours(0, 0, 0, 0);\t// kill the time - i only want the date part of the date object\n\nexport default {\n\tappUrl: appUrl,\n\tenums: enums,\n\temptyText: '---',\n\tforceResyncBeforeDate: '2023-06-01T07:00:00',\t// set a date string here, if lastSyncDate comes before this date, a full force Sync will happen\n\tisDev: isDev,\n\tisLive: isLive,\n\tisTest: isTest,\n\tplatformId: enums.Platform.ADD_IN,\n\ttoday: todayDate,\n\tusePendo: (isLive) ? true : false, // use Pendo - live site only\n\tuseErrorLogger: (isTest || isLive) ? true : false, // use Rollbar - test and live sites only\n}","/*\n- HelperGetReferenceFormatId\n-- 2024.08.05\n*/\nimport config from '@/config';\nimport router from '@/router';\nimport store from '@/store';\n\nexport default () => {\n // console.log('HelperGetReferenceFormatId');\n\n if(config.platformId === config.enums.Platform.ONLINE){\n if(router.currentRoute.meta.module === config.enums.Module.REFERENCE_LIST){\n return store.state.references.displayFormatVersionId;\n\n } else if(router.currentRoute.meta.module === config.enums.Module.REFERENCE_EDIT){\n return store.state.references.displayFormatVersionId;\n\n } else if(router.currentRoute.meta.module === config.enums.Module.PAPER_EDIT){\n return store.state.paperEdit.meta.PaperFormatVersionID;\n \n }\n\n } else if(config.platformId === config.enums.Platform.ADD_IN){\n return store.state.formatVersionID;\n\n } else if(config.platformId === config.enums.Platform.CHROME_EXT){\n return store.state.formatVersionID;\n\n } else {\n console.log('HelperGetReferenceFormatId missing a platform match')\n return config.enums.Format.APA7;\n\n }\n \n \n return '0';\n\n}\n","/*\n- WordDocumentProps\n-- get and set Word doc properties\n*/\n\nexport default {\n\t// used to add a single prop $opts.key : $opts.value\n\taddCustomProp($opts){\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tWord.run((context) =>{\n\t\t\t\t//set the doc prop\n\t\t\t\tcontext.document.properties.customProperties.add($opts.key, $opts.value);\n\t\n\t\t\t\treturn context.sync().then(()=>{\n\t\t\t\t\treturn resolve();\n\t\t\t\t});\n\t\t\t});//e:Word.run\n\t\t});//e:Promise\n\t},//e:addCustomProp\n\n\t// checks version to see if it's possible to set doc props - returns boolean\n\tcanSetDocProps(){\n\t\tconsole.log(\"Platform: \" + Office.context.platform);\n\t\tconsole.log(\"Version: \" + Office.context.diagnostics.version);\n\n\t\tif(Office.context.platform === 'Mac' && Office.context.diagnostics.version.substr(0,5) === '16.27'){\n\t\t\treturn false;\n\t\t}\n\n\t\tif(Office.context.platform === 'iOS' && Office.context.diagnostics.version.substr(0,4) === '2.27'){\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t},//e:canSetDocProps\n\n\n\t// used to get all custom doc props - returns object of keys: values\n\tgetAllCustomProps(){\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tWord.run((context) =>{\n\t\t\t\tlet docProps = context.document.properties.customProperties;\n\t\t\t\tdocProps.load(\"key,type,value\");\n\t\t\t\treturn context.sync().then(() => {\n\t\t\t\t\tlet returnProps = {};\n\t\t\t\t\t// build object of key:value pairs from items\n\t\t\t\t\tdocProps.items.forEach((item)=>{\n\t\t\t\t\t\treturnProps[item.key] = item.value;\n\t\t\t\t\t});\n\t\t\t\t\tresolve(returnProps);\n\t\t\t\t});\n\t\t\t});//e:Word.run\n\t\t});//e:Promise\n\t},//e:getAllCustomProps\n\n\t// used to get a single custom doc prop - returns the prop value only\n\tgetCustomProp(propName){\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tWord.run((context) =>{\n\t\t\t\tlet docProps = context.document.properties.customProperties;\n\t\t\t\treturn context.sync().then(()=>{\n\t\t\t\t\tlet docPropsObject = docProps.getItemOrNullObject(propName);\n\t\t\t\t\tcontext.load(docPropsObject);\n\t\t\t\t\treturn context.sync().then(() =>{\n\t\t\t\t\t\tif(typeof docPropsObject.value === 'undefined'){\n\t\t\t\t\t\t\treject();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(docPropsObject.value);\t\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});//e:Word.run\n\t\t});//e:Promise\n\t},//e:getCustomProp\n\n\t// used to get a single custom doc prop - returns the prop value only\n\tuseAdvancedMode(){\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tWord.run((context) =>{\n\t\t\t\tlet docProps = context.document.properties.customProperties;\n\t\t\t\treturn context.sync().then(()=>{\n\t\t\t\t\tlet docPropsObject = docProps.getItemOrNullObject(\"UseAdvancedMode\");\n\t\t\t\t\tcontext.load(docPropsObject);\n\t\t\t\t\treturn context.sync().then(() =>{\n\t\t\t\t\t\tif(docPropsObject.value){\n\t\t\t\t\t\t\tresolve(docPropsObject.value);\t\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t//if this isn't found it's ok, default to false\n\t\t\t\t\t\t\tresolve(false);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});//e:Word.run\n\t\t});//e:Promise\n\t},//e:useAdvancedMode\n\n\t// used to get a single custom doc prop - returns the prop value only\n\tuseNewCitationMode(){\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tWord.run((context) =>{\n\t\t\t\tlet docProps = context.document.properties.customProperties;\n\t\t\t\treturn context.sync().then(()=>{\n\t\t\t\t\tlet docPropsObject = docProps.getItemOrNullObject(\"UseNewCitationMode\");\n\t\t\t\t\tcontext.load(docPropsObject);\n\t\t\t\t\treturn context.sync().then(() =>{\n\t\t\t\t\t\tif(docPropsObject.value){\n\t\t\t\t\t\t\tresolve(docPropsObject.value);\t\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t//if this isn't found it's ok, default to false\n\t\t\t\t\t\t\tresolve(false);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});//e:Word.run\n\t\t});//e:Promise\n\t},//e:useAdvancedMode\n\n\t// used to get a single doc prop (not custom) - returns the prop value only\n\tgetDocProp(propName){\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tWord.run((context) =>{\n\t\t\t\tlet docProps = context.document.properties;\n\t\t\t\treturn context.sync().then(()=>{\n\t\t\t\t\tcontext.load(docProps);\n\t\t\t\t\treturn context.sync().then(() =>{\n\t\t\t\t\t\tif(docProps[propName]){\n\t\t\t\t\t\t\tresolve(docProps[propName]);\t\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treject();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});//e:Word.run\n\t\t});//e:Promise\n\t},//e:getDocProp\n\n\t// used to set a single prop $opts.key : $opts.value / returns an empty resolve\n\tsetCustomProp($opts){\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif(!$opts.key){\n\t\t\t\treturn reject();\n\t\t\t}\n\n\t\t\tWord.run((context) =>{\n\t\t\t\t// https://stackoverflow.com/questions/44788002/word-add-in-how-to-read-custom-document-property\n\t\t\t\tcontext.document.properties.customProperties.add($opts.key, $opts.value);\n\t\t\t\treturn context.sync().then(() =>{\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});//e:Word.run\n\t\t});//e:Promise\n\t},//e:setCustomProp\n\n\t// used to set a single doc prop $opts.key : $opts.value\n\tsetDocProp($opts){\n\t\tif(!$opts.key){\n\t\t\treturn;\n\t\t}\n\t\tWord.run((context) =>{\n\t\t\treturn context.sync().then(() => {\n\t\t\t\tcontext.document.properties[$opts.key] = $opts.value;\n\t\t\t});\n\t\t});//e:Word.run\n\t},//e:setDocProp\n\n}//e:export","var render = function render() {\n var _vm = this,\n _c = _vm._self._c\n return _c(\n \"div\",\n { class: { \"show-beta-features\": _vm.showBetaFeatures } },\n [\n _c(\"loader-component\", { attrs: { \"loader-id\": \"App\" } }),\n _vm._v(\" \"),\n _c(\"toaster\"),\n _vm._v(\" \"),\n _c(\"sidemenu\"),\n _vm._v(\" \"),\n _c(\"router-view\", { staticClass: \"pb-2\" }),\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\nexport { render, staticRenderFns }","var render = function render() {\n var _vm = this,\n _c = _vm._self._c\n return _c(\"transition\", { attrs: { name: \"loader-fade\" } }, [\n _c(\n \"div\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.isShown,\n expression: \"isShown\",\n },\n ],\n staticClass: \"loader-mask\",\n },\n [\n _c(\n \"div\",\n {\n staticClass: \"spinner-border text-primary\",\n attrs: { role: \"status\" },\n },\n [\n _c(\"span\", { staticClass: \"visually-hidden\" }, [\n _vm._v(\"Loading...\"),\n ]),\n ]\n ),\n _vm._v(\" \"),\n _vm.$platformId === _vm.$enums.Platform.ONLINE\n ? _c(\n \"router-link\",\n {\n staticClass: \"btn-logout-spinner btn btn-link btn-sm\",\n attrs: {\n to: {\n name: \"Logout\",\n },\n },\n },\n [_vm._v(\"\\n\\t\\t\\tLogout\\n\\t\\t\")]\n )\n : _vm.$platformId === _vm.$enums.Platform.ADD_IN ||\n _vm.$platformId === _vm.$enums.Platform.CHROME_EXT\n ? _c(\n \"button\",\n {\n staticClass: \"btn-logout-spinner btn btn-link btn-sm\",\n attrs: { type: \"button\" },\n on: {\n click: function ($event) {\n $event.preventDefault()\n return _vm.fullLogout.apply(null, arguments)\n },\n },\n },\n [_vm._v(\"\\n\\t\\t\\tLog Out\\n\\t\\t\")]\n )\n : _vm._e(),\n ],\n 1\n ),\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-1.use!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Loader.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-1.use!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Loader.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./Loader.vue?vue&type=template&id=f45d7694&scoped=true\"\nimport script from \"./Loader.vue?vue&type=script&lang=js\"\nexport * from \"./Loader.vue?vue&type=script&lang=js\"\nimport style0 from \"./Loader.vue?vue&type=style&index=0&id=f45d7694&prod&lang=scss&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f45d7694\",\n null\n \n)\n\nexport default component.exports","var render = function render() {\n var _vm = this,\n _c = _vm._self._c\n return _c(\"div\", { class: [\"sidemenu-wrp\", { open: _vm.isSidebarOpen }] }, [\n _c(\n \"div\",\n { staticClass: \"w-100 d-block\" },\n [\n _c(\n \"a\",\n {\n staticClass: \"close-sidemenu\",\n attrs: { href: \"#\" },\n on: {\n click: function ($event) {\n $event.preventDefault()\n return _vm.closeMenu.apply(null, arguments)\n },\n },\n },\n [\n _c(\"span\", {\n staticClass: \"svg bi-x-lg\",\n attrs: { title: \"Open Menu\" },\n }),\n _vm._v(\" CLOSE\\n\\t\\t\"),\n ]\n ),\n _vm._v(\" \"),\n _c(\"hr\"),\n _vm._v(\" \"),\n _vm.showDevTools\n ? _c(\n \"div\",\n [\n _c(\n \"a\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: _vm.showBetaFeatures,\n expression: \"showBetaFeatures\",\n },\n ],\n staticClass: \"router-link\",\n attrs: { href: \"#\" },\n on: {\n click: function ($event) {\n $event.preventDefault()\n return _vm.setShowBetaFeatures(false)\n },\n },\n },\n [_vm._v(\"\\n\\t\\t\\t\\tHide Beta Features\\n\\t\\t\\t\")]\n ),\n _vm._v(\" \"),\n _c(\n \"a\",\n {\n directives: [\n {\n name: \"show\",\n rawName: \"v-show\",\n value: !_vm.showBetaFeatures,\n expression: \"!showBetaFeatures\",\n },\n ],\n staticClass: \"router-link\",\n attrs: { href: \"#\" },\n on: {\n click: function ($event) {\n $event.preventDefault()\n return _vm.setShowBetaFeatures(true)\n },\n },\n },\n [_vm._v(\"\\n\\t\\t\\t\\tShow Beta Features\\n\\t\\t\\t\")]\n ),\n _vm._v(\" \"),\n _c(\n \"router-link\",\n {\n staticClass: \"router-link\",\n attrs: { to: { name: \"ErrorTests\" } },\n },\n [_vm._v(\"\\n\\t\\t\\t\\tError Tests\\n\\t\\t\\t\")]\n ),\n _vm._v(\" \"),\n _c(\n \"router-link\",\n {\n staticClass: \"router-link\",\n attrs: { to: { name: \"DeveloperTools\" } },\n },\n [_vm._v(\"\\n\\t\\t\\t\\tDeveloper Tools\\n\\t\\t\\t\")]\n ),\n _vm._v(\" \"),\n _c(\"hr\"),\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.iOS\n ? _c(\n \"div\",\n [\n _c(\n \"router-link\",\n {\n staticClass: \"router-link\",\n attrs: { to: { name: \"Startup\" } },\n },\n [_vm._v(\"\\n\\t\\t\\t\\tGetting Started\\n\\t\\t\\t\")]\n ),\n ],\n 1\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"router-link\",\n {\n staticClass: \"router-link\",\n attrs: { to: { name: \"DocumentCreateLanding\" } },\n },\n [_vm._v(\"\\n\\t\\t\\tCreate New Paper\\n\\t\\t\")]\n ),\n _vm._v(\" \"),\n _c(\"hr\"),\n _vm._v(\" \"),\n _c(\n \"router-link\",\n {\n staticClass: \"router-link\",\n attrs: { to: { name: \"PaperSectionsTitlePage\" } },\n },\n [\n _vm._v(\"\\n\\t\\t\\tTitle \"),\n _vm.documentType === _vm.$enums.DocumentType.RESEARCH_PAPER &&\n (_vm.formatVersionID === _vm.$enums.Format.APA6 ||\n _vm.formatVersionID === _vm.$enums.Format.APA7)\n ? _c(\"span\", [_vm._v(\"Page\")])\n : _vm._e(),\n ]\n ),\n _vm._v(\" \"),\n _vm.documentType === _vm.$enums.DocumentType.RESEARCH_PAPER\n ? _c(\n \"router-link\",\n {\n key: \"linkAbstract\",\n staticClass: \"router-link\",\n attrs: { to: { name: \"PaperSectionsAbstract\" } },\n },\n [_vm._v(\"Abstract\")]\n )\n : _c(\n \"a\",\n {\n key: \"linkNoAbstract\",\n staticClass: \"router-link disabled\",\n attrs: { href: \"#\" },\n on: {\n click: function ($event) {\n $event.preventDefault()\n },\n },\n },\n [_vm._v(\"Abstract\")]\n ),\n _vm._v(\" \"),\n _vm.documentType === _vm.$enums.DocumentType.RESEARCH_PAPER\n ? _c(\n \"router-link\",\n {\n key: \"linkToc\",\n staticClass: \"router-link\",\n attrs: { to: { name: \"PaperSectionsToc\" } },\n },\n [_vm._v(\"Table of Contents\")]\n )\n : _c(\n \"a\",\n {\n key: \"linkNoToc\",\n staticClass: \"router-link disabled\",\n attrs: { href: \"#\" },\n on: {\n click: function ($event) {\n $event.preventDefault()\n },\n },\n },\n [_vm._v(\"Table of Contents\")]\n ),\n _vm._v(\" \"),\n _vm.documentType === _vm.$enums.DocumentType.RESEARCH_PAPER\n ? _c(\n \"router-link\",\n {\n key: \"linkAppendices\",\n staticClass: \"router-link\",\n attrs: { to: { name: \"PaperSectionsAppendix\" } },\n },\n [_vm._v(\"Appendices\")]\n )\n : _c(\n \"a\",\n {\n key: \"linkNoAppendices\",\n staticClass: \"router-link disabled\",\n attrs: { href: \"#\" },\n on: {\n click: function ($event) {\n $event.preventDefault()\n },\n },\n },\n [_vm._v(\"Appendices\")]\n ),\n _vm._v(\" \"),\n _c(\"hr\"),\n _vm._v(\" \"),\n _c(\n \"router-link\",\n {\n staticClass: \"router-link\",\n attrs: { to: { name: \"ReferencesCitations\" } },\n },\n [_vm._v(\"\\n\\t\\t\\tReferences & Citations\\n\\t\\t\")]\n ),\n _vm._v(\" \"),\n _c(\n \"router-link\",\n {\n staticClass: \"router-link\",\n attrs: {\n to: {\n name: \"ResearchNotes\",\n },\n },\n },\n [_vm._v(\"\\n\\t\\t\\tResearch Notes\\n\\t\\t\")]\n ),\n _vm._v(\" \"),\n _c(\"hr\"),\n _vm._v(\" \"),\n _vm.iOS\n ? _c(\n \"router-link\",\n {\n staticClass: \"router-link\",\n attrs: { to: { name: \"TextStyles\" } },\n },\n [_vm._v(\"\\n\\t\\t\\tText & Headings\\n\\t\\t\")]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _vm.documentType !== _vm.$enums.DocumentType.ANNOTATED_BIBLIOGRAPHY &&\n _vm.documentType !== _vm.$enums.DocumentType.REFERENCE_LIST\n ? _c(\n \"router-link\",\n {\n key: \"linkInsertFigure\",\n staticClass: \"router-link\",\n attrs: { to: { name: \"InsertFigure\" } },\n },\n [_vm._v(\"Insert Figure\")]\n )\n : _c(\n \"a\",\n {\n key: \"linkNoInsertFigure\",\n staticClass: \"router-link disabled\",\n attrs: { href: \"#\" },\n on: {\n click: function ($event) {\n $event.preventDefault()\n },\n },\n },\n [_vm._v(\"Insert Figure\")]\n ),\n _vm._v(\" \"),\n _vm.documentType !== _vm.$enums.DocumentType.ANNOTATED_BIBLIOGRAPHY &&\n _vm.documentType !== _vm.$enums.DocumentType.REFERENCE_LIST\n ? _c(\n \"router-link\",\n {\n key: \"linkInsertTable\",\n staticClass: \"router-link\",\n attrs: { to: { name: \"InsertTable\" } },\n },\n [_vm._v(\"Insert Table\")]\n )\n : _c(\n \"a\",\n {\n key: \"linkNoInsertTable\",\n staticClass: \"router-link disabled\",\n attrs: { href: \"#\" },\n on: {\n click: function ($event) {\n $event.preventDefault()\n },\n },\n },\n [_vm._v(\"Insert Table\")]\n ),\n _vm._v(\" \"),\n _c(\"hr\"),\n _vm._v(\" \"),\n _vm.formatVersionID === _vm.$enums.Format.APA7\n ? _c(\n \"router-link\",\n {\n key: \"linkAem\",\n staticClass: \"router-link\",\n attrs: { to: { name: \"AdvancedEditing\" } },\n },\n [_vm._v(\"\\n\\t\\t\\tAdvanced Editing\\n\\t\\t\")]\n )\n : _c(\n \"a\",\n {\n key: \"linkNoAem\",\n staticClass: \"router-link disabled\",\n attrs: { href: \"#\" },\n on: {\n click: function ($event) {\n $event.preventDefault()\n },\n },\n },\n [_vm._v(\"Advanced Editing\")]\n ),\n _vm._v(\" \"),\n _c(\"hr\"),\n _vm._v(\" \"),\n _vm.iOS\n ? _c(\"div\", [\n _c(\n \"a\",\n {\n staticClass: \"router-link\",\n attrs: {\n href: \"https://perrla.zendesk.com/hc/en-us/categories/360001366714-PERRLA-Add-in-BETA-\",\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n },\n [_vm._v(\"Help\")]\n ),\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"router-link\",\n {\n staticClass: \"router-link\",\n attrs: { to: { name: \"PaperReview\" } },\n },\n [_vm._v(\"\\n\\t\\t\\tPaper Review\\n\\t\\t\")]\n ),\n _vm._v(\" \"),\n _c(\n \"router-link\",\n { staticClass: \"router-link\", attrs: { to: { name: \"Settings\" } } },\n [_vm._v(\"\\n\\t\\t\\tSettings\\n\\t\\t\")]\n ),\n ],\n 1\n ),\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-1.use!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideMenu.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-1.use!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideMenu.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./SideMenu.vue?vue&type=template&id=6816212b&scoped=true\"\nimport script from \"./SideMenu.vue?vue&type=script&lang=js\"\nexport * from \"./SideMenu.vue?vue&type=script&lang=js\"\nimport style0 from \"./SideMenu.vue?vue&type=style&index=0&id=6816212b&prod&lang=scss&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6816212b\",\n null\n \n)\n\nexport default component.exports","var render = function render() {\n var _vm = this,\n _c = _vm._self._c\n return _c(\n \"div\",\n { ref: \"toasterWrp\", class: [\"toaster\", { open: _vm.isOpen }] },\n [\n _c(\"div\", {\n class: [\"toaster-header toaster-\" + _vm.type],\n domProps: { innerHTML: _vm._s(_vm.title) },\n }),\n _vm._v(\" \"),\n _vm.body.length > 0\n ? _c(\"div\", { staticClass: \"toaster-body\" }, [\n _c(\"div\", { domProps: { innerHTML: _vm._s(_vm.body) } }),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"d-grid\" }, [\n _c(\n \"button\",\n {\n class: [\"btn btn-\" + _vm.buttonType],\n attrs: { type: \"button\" },\n on: {\n click: function ($event) {\n $event.preventDefault()\n _vm.isOpen = false\n },\n },\n },\n [_vm._v(\"\\n\\t\\t\\t\\t\" + _vm._s(_vm.buttonText) + \"\\n\\t\\t\\t\")]\n ),\n ]),\n ])\n : _vm._e(),\n ]\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-1.use!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Toaster.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-1.use!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Toaster.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./Toaster.vue?vue&type=template&id=238c5924\"\nimport script from \"./Toaster.vue?vue&type=script&lang=js\"\nexport * from \"./Toaster.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n\n","/*\n- ApiS_LogBrowser\n-- logs the users browser information in the vuex store\n-- 2023.07.13\n*/\nimport _forEach from 'lodash/forEach';\nimport { detect } from 'detect-browser';\nimport store from '@/store';\n\nexport default () => {\n\treturn new Promise((resolve) => {\n\t\t// console.log('ApiS_LogBrowser');\n\n\t\tconst browser = detect();\n\t\t\t\n\t\tlet os = '';\n\n\t\tconst clientStrings = [\n\t\t\t{s:'Windows 10', r:/(Windows 10.0|Windows NT 10.0)/},\n\t\t\t{s:'Windows 8.1', r:/(Windows 8.1|Windows NT 6.3)/},\n\t\t\t{s:'Windows 8', r:/(Windows 8|Windows NT 6.2)/},\n\t\t\t{s:'Windows 7', r:/(Windows 7|Windows NT 6.1)/},\n\t\t\t{s:'Windows Vista', r:/Windows NT 6.0/},\n\t\t\t{s:'Windows Server 2003', r:/Windows NT 5.2/},\n\t\t\t{s:'Windows XP', r:/(Windows NT 5.1|Windows XP)/},\n\t\t\t{s:'Windows 2000', r:/(Windows NT 5.0|Windows 2000)/},\n\t\t\t{s:'Windows ME', r:/(Win 9x 4.90|Windows ME)/},\n\t\t\t{s:'Windows 98', r:/(Windows 98|Win98)/},\n\t\t\t{s:'Windows 95', r:/(Windows 95|Win95|Windows_95)/},\n\t\t\t{s:'Windows NT 4.0', r:/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},\n\t\t\t{s:'Windows CE', r:/Windows CE/},\n\t\t\t{s:'Windows 3.11', r:/Win16/},\n\t\t\t{s:'Android', r:/Android/},\n\t\t\t{s:'Open BSD', r:/OpenBSD/},\n\t\t\t{s:'Sun OS', r:/SunOS/},\n\t\t\t{s:'Chrome OS', r:/CrOS/},\n\t\t\t{s:'Linux', r:/(Linux|X11(?!.*CrOS))/},\n\t\t\t{s:'iOS', r:/(iPhone|iPad|iPod)/},\n\t\t\t{s:'Mac OS X', r:/Mac OS X/},\n\t\t\t{s:'Mac OS', r:/(Mac OS|MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},\n\t\t\t{s:'QNX', r:/QNX/},\n\t\t\t{s:'UNIX', r:/UNIX/},\n\t\t\t{s:'BeOS', r:/BeOS/},\n\t\t\t{s:'OS/2', r:/OS\\/2/},\n\t\t\t{s:'Search Bot', r:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\\/Teoma|ia_archiver)/}\n\t\t];\n\t\n\t\t_forEach(clientStrings, (cs)=>{\n\t\t\tif (cs.r.test(navigator.userAgent)) {\n\t\t\t\tos = cs.s;\n\t\t\t\treturn;\t// stop when you find one\n\t\t\t}\n\t\t});\n\n\t\tlet osVersion = '';\n\t\tif (/Windows/.test(os)) {\n\t\t\tosVersion = /Windows (.*)/.exec(os)[1];\n\t\t\tos = 'Windows';\n\t\t}\n\n\t\t// console.log(browser);\n\n\t\tstore.commit('api/SET_BROWSER_NAME', browser.name || '');\n\t\tstore.commit('api/SET_BROWSER_VERSION', browser.version || '');\n\t\tstore.commit('api/SET_OS_NAME', browser.os);\n\t\tstore.commit('api/SET_OS_VERSION', os + ' ' + osVersion);\n\n\t\tresolve();\n\n\t});//e:Promise\n}\n","import mod from \"-!../node_modules/babel-loader/lib/index.js??clonedRuleSet-1.use!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../node_modules/babel-loader/lib/index.js??clonedRuleSet-1.use!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=d8fc8e64\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import \"core-js/stable\";\r\nimport \"regenerator-runtime/runtime\";\r\n\r\nimport _has from 'lodash/has';\r\nimport App from '@/App';\r\nimport config from '@/config'\r\nimport { detect } from 'detect-browser';\r\nimport Dropdown from 'bootstrap/js/dist/dropdown'; // importing here so it can build inside the main app chunk, it will be grayed out\r\nimport mitt from 'mitt';\r\nimport Rollbar from 'rollbar';\r\nimport router from '@/router'\r\nimport store from '@/store'\r\nimport styles from '@/assets/styles/app.scss';\r\nimport Vue from 'vue';\r\nimport VueGtag from \"vue-gtag\";\t\t\t\t// https://github.com/MatteoGabriele/vue-gtag\r\n\r\nimport VueDebounce from 'vue-debounce';\r\nVue.use(VueDebounce);\r\n\r\nimport 'office-ui-fabric-js/dist/css/fabric.min.css';\r\nimport 'office-ui-fabric-js/dist/css/fabric.components.css';\r\nimport 'office-ui-fabric-js/dist/js/fabric.js';\r\n\r\nconst emitter = mitt();\r\n\r\nif(!config.isDev){\r\n\tconsole.log(VERSION);\r\n}\r\n\r\n// Rollbar Config\r\nif(config.useErrorLogger){\r\n\tVue.prototype.$rollbar = new Rollbar({\r\n\t\taccessToken: 'a760930638354ae5917524dc6f441273',\r\n\t\tcaptureUncaught: true,\r\n\t\tcaptureUnhandledRejections: true,\r\n\t\tenabled: true,\r\n\t\tenvironment: (config.isLive) ? \"production\" : \"staging\",\r\n\t\tfilterTelemetry: function(e) {\r\n\t\t\treturn e.type === 'network'\r\n\t\t\t\t&& e.body.subtype === 'xhr'\r\n\t\t\t\t&& (\r\n\t\t\t\t\te.body.url.indexOf('https://bam') === 0 ||\r\n\t\t\t\t\te.body.url.indexOf('https://stats') === 0 ||\r\n\t\t\t\t\te.body.url.indexOf('https://www.google') === 0 || \r\n\t\t\t\t\te.body.url.indexOf('https://ekr.zdassets') === 0 \r\n\t\t\t\t);\r\n\t\t},\r\n\t\thostSafeList: ['perrlacomplete.com', 'perrla.com'],\r\n\t\t// Characters that may need to be escaped include: ^, $, ., |, ?, *, +, (), [], and {}. In order for these to remain escaped in the regex matcher, they should be doubled escaped when passed in the config.\r\n\t\tignoredMessages: [\r\n\t\t\t\"AccessDenied\",\r\n\t\t\t\"An internal error has occurred.\",\r\n\t\t\t\"Cannot read properties of undefined \\\\(reading 'isSetSupported'\\\\)\",\r\n\t\t\t\"Cannot set properties of undefined \\\\(setting 'status'\\\\)\",\r\n\t\t\t\"Can't find variable Office\",\r\n\t\t\t\"GeneralException\",\r\n\t\t\t\"InvalidArgument\",\r\n\t\t\t\"Item sent with null or missing arguments.\",\r\n\t\t\t\"ItemNotFound\",\r\n\t\t\t\"Neither the locale, en-us, provided by the host app nor the fallback locale en-us are supported\\\\.\",\r\n\t\t\t\"MicrosoftAjax\\\\.js is not loaded successfully\\\\.\",\r\n\t\t\t\"Office is not defined\",\r\n\t\t\t\"ResizeObserver loop limit exceeded\",\r\n\t\t\t\"Script error\\\\.\",\r\n\t\t\t\"Strings is not defined\",\r\n\t\t\t\"Unable to set property 'status' of undefined or null reference\",\r\n\t\t\t\"Unable to get property 'id' of undefined or null reference\",\r\n\t\t\t\"Unexpected token '\\\\.'\",\r\n\t\t],\r\n\t\tpayload: {\r\n\t\t\tclient: {\r\n\t\t\t\tcode_version: VERSION,\r\n\t\t\t},\r\n\t\t},\r\n\t\tsource_map_enabled: (config.isLive) ? true : false,\r\n\t\tverbose: true,\r\n\t});\r\n}\r\n\r\nVue.config.errorHandler = (error, vm, info) => {\r\n\tif(config.useErrorLogger){\r\n\t\tvm.$rollbar.error(error);\r\n\t} else {\r\n\t\tconsole.group('Vue Error');\r\n\t\tconsole.log(error);\r\n\t\tconsole.log(info);\r\n\t\tconsole.groupEnd();\r\n\t}\r\n\tthrow error; // rethrow\r\n}\r\n\r\n\r\n// Register a global custom directive called `v-focus`\r\nVue.directive('focus', {\r\n\t// When the bound element is inserted into the DOM...\r\n\tinserted: function (el) {\r\n\t\t// Focus the element\r\n\t\tel.focus();\r\n\t}\r\n});\r\n\r\n// Adds Target Blank to a link inside reference output\r\nVue.directive('add-blank-target', {\r\n\tinserted(el){\r\n\t\t// regEx for href conetent\r\n\t\tconst isLinkInContent = RegExp('href=\"([^\\'\\\"]+)');\r\n\t\t\r\n\t\t// Only if there is a link in the content\r\n\t\tif(isLinkInContent.test(el.innerHTML)){\r\n\t\t\tlet parser = new DOMParser();\r\n\t\t\tlet parsedHtml = parser.parseFromString(el.innerHTML, 'text/html');\r\n\t\t\tlet aElements = parsedHtml.getElementsByTagName(\"a\");\r\n\t\t\t\r\n\t\t\t// double check to make sure this is really an \r\n\t\t\tif(aElements && aElements[0]){\r\n\t\t\t\ttry {\r\n\t\t\t\t\tlet newUrl = window.decodeURIComponent(aElements[0].getAttribute('href'));\r\n\t\t\t\t\tnewUrl = newUrl.trim().replace(/\\s/g, \"\");\r\n\t\t\t\t\tif(/^(:\\/\\/)/.test(newUrl)){\r\n\t\t\t\t\t\tnewUrl = `http${newUrl}`;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(!/^(f|ht)tps?:\\/\\//i.test(newUrl)){\r\n\t\t\t\t\t\tnewUrl = `http://${newUrl}`;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\taElements[0].setAttribute('href', newUrl);\r\n\t\t\t\t} catch {\r\n\t\t\t\t\tconsole.log('decodeURIComponent failed 1');\r\n\t\t\t\t\tconsole.log(aElements[0]); // https://www.florida-demographics.com/pasco-county-demographics#:~:text=Race&Ethnicity2020,%)andBlack(5.6%).\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tel.innerHTML = parsedHtml.body.innerHTML;\r\n\t\t}\r\n\t},\r\n\tupdate(el) {\r\n\t\t// regEx for href content\r\n\t\tconst isLinkInContent = RegExp('href=\"([^\\'\\\"]+)');\r\n\t\t\r\n\t\t// Only if there is a link in the content\r\n\t\tif(isLinkInContent.test(el.innerHTML)){\r\n\t\t\tlet parser = new DOMParser();\r\n\t\t\tlet parsedHtml = parser.parseFromString(el.innerHTML, 'text/html');\r\n\t\t\tlet aElements = parsedHtml.getElementsByTagName(\"a\");\r\n\t\t\t\r\n\t\t\t// double check to make sure this is really an \r\n\t\t\tif(aElements && aElements[0]){\r\n\t\t\t\ttry {\r\n\t\t\t\t\tlet newUrl = window.decodeURIComponent(aElements[0].getAttribute('href'));\r\n\t\t\t\t\tnewUrl = newUrl.trim().replace(/\\s/g, \"\");\r\n\r\n\t\t\t\t\tif(/^(:\\/\\/)/.test(newUrl)){\r\n\t\t\t\t\t\tnewUrl = `http${newUrl}`;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(!/^(f|ht)tps?:\\/\\//i.test(newUrl)){\r\n\t\t\t\t\t\tnewUrl = `http://${newUrl}`;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// console.log('newUrl');\r\n\t\t\t\t\t// console.log(newUrl);\r\n\t\t\t\t\taElements[0].setAttribute('href', newUrl);\r\n\t\t\t\t} catch {\r\n\t\t\t\t\tconsole.log('decodeURIComponent failed 2');\r\n\t\t\t\t\tconsole.log(aElements[0]); // https://www.florida-demographics.com/pasco-county-demographics#:~:text=Race&Ethnicity2020,%)andBlack(5.6%).\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tel.innerHTML = parsedHtml.body.innerHTML;\r\n\t\t}\r\n\t}\r\n});\r\n\r\n\r\n// Convert Config Settings to Vue Instance Properties (to use in vue templates)\r\nVue.prototype.emitter = emitter;\r\nVue.prototype.$enums = config.enums;\r\nVue.prototype.$isDev = config.isDev;\r\nVue.prototype.$isTest = config.isTest;\r\nVue.prototype.$isLive = config.isLive;\r\nVue.prototype.$platformId = config.platformId;\r\nVue.prototype.$version = VERSION;\r\n\r\nconst browser = detect();\r\nlet os = '';\r\n\r\nconst clientStrings = [\r\n\t{s:'Windows 10', r:/(Windows 10.0|Windows NT 10.0)/},\r\n\t{s:'Windows 8.1', r:/(Windows 8.1|Windows NT 6.3)/},\r\n\t{s:'Windows 8', r:/(Windows 8|Windows NT 6.2)/},\r\n\t{s:'Windows 7', r:/(Windows 7|Windows NT 6.1)/},\r\n\t{s:'Windows Vista', r:/Windows NT 6.0/},\r\n\t{s:'Windows Server 2003', r:/Windows NT 5.2/},\r\n\t{s:'Windows XP', r:/(Windows NT 5.1|Windows XP)/},\r\n\t{s:'Windows 2000', r:/(Windows NT 5.0|Windows 2000)/},\r\n\t{s:'Windows ME', r:/(Win 9x 4.90|Windows ME)/},\r\n\t{s:'Windows 98', r:/(Windows 98|Win98)/},\r\n\t{s:'Windows 95', r:/(Windows 95|Win95|Windows_95)/},\r\n\t{s:'Windows NT 4.0', r:/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},\r\n\t{s:'Windows CE', r:/Windows CE/},\r\n\t{s:'Windows 3.11', r:/Win16/},\r\n\t{s:'Android', r:/Android/},\r\n\t{s:'Open BSD', r:/OpenBSD/},\r\n\t{s:'Sun OS', r:/SunOS/},\r\n\t{s:'Chrome OS', r:/CrOS/},\r\n\t{s:'Linux', r:/(Linux|X11(?!.*CrOS))/},\r\n\t{s:'iOS', r:/(iPhone|iPad|iPod)/},\r\n\t{s:'Mac OS X', r:/Mac OS X/},\r\n\t{s:'Mac OS', r:/(Mac OS|MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},\r\n\t{s:'QNX', r:/QNX/},\r\n\t{s:'UNIX', r:/UNIX/},\r\n\t{s:'BeOS', r:/BeOS/},\r\n\t{s:'OS/2', r:/OS\\/2/},\r\n\t{s:'Search Bot', r:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\\/Teoma|ia_archiver)/}\r\n];\r\nfor (let id in clientStrings) {\r\n\tlet cs = clientStrings[id];\r\n\tif (cs.r.test(navigator.userAgent)) {\r\n\t\tos = cs.s;\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nlet osVersion = '';\r\nif (/Windows/.test(os)) {\r\n\tosVersion = /Windows (.*)/.exec(os)[1];\r\n\tos = 'Windows';\r\n}\r\n\r\nlet OSVersionOutput = os + ' ' + osVersion;\r\n\r\n/*\r\n// Add to Vue properties, so i can also call the same values after sync\r\n(i don't like this, after this pass remove this and get the values from the store)\r\n*/\r\nVue.prototype.$browser = browser.name || '';\r\nVue.prototype.$browserVersion = browser.version || '';\r\nVue.prototype.$os = (browser.os === 'Mac OS') ? 'MacOS' : 'Windows';\r\nVue.prototype.$osVersion = OSVersionOutput;\r\nVue.prototype.$sourceApp = 'WordAddIn';\r\nVue.prototype.$sourceAppVersion = Vue.prototype.$version;\r\n\r\n\r\n// Google Analytics\r\nif(config.isLive){\r\n\tVue.use(VueGtag, {\r\n\t\tconfig: { id: \"UA-8625624-8\" },\r\n\t\tglobalObjectName: 'PERRLAGtag',\r\n\t\tparams: {\r\n\t\t\tsend_page_view: false\r\n\t\t}\r\n\t}, router);\r\n}\r\n\r\nOffice.onReady(function() {\r\n\t// Office is ready\r\n\tif (_has(Office, 'context') && _has(Office.context, 'requirements') && (Office.context.requirements.isSetSupported('DialogApi', '1.2') || Office.context.requirements.isSetSupported('WordApi', '1.1'))) {\r\n\t\twindow.$vm = new Vue({\r\n\t\t\trender: ((createEL) => {\r\n\t\t\t\treturn createEL(App);\r\n\t\t\t}),\r\n\t\t\trouter,\r\n\t\t\tstore,\r\n\t\t}).$mount('#app');\r\n\t} else {\r\n\t\tdocument.getElementById('loadError').style.display = 'block';\r\n\t}\r\n});\r\n","export default [\n\t{\n\t\tname: 'AddUpdatePaymentMethod',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCart\" */ '@/views/Cart/AddUpdatePaymentMethod'),\n\t\tpath: '/payment-method',\n\t\tmeta: {\n\t\t\t// layout: config.enums.Layout.PCOM,\n\t\t},\n\t},\n\t{\n\t\tname: 'PaymentSettings',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCart\" */ '@/views/Cart/PaymentSettings'),\n\t\tpath: '/cart-step-3',\n\t\tmeta: {\n\t\t\t// layout: config.enums.Layout.PCOM,\n\t\t},\n\t},\n\t{\n\t\tname: 'PaymentSettingsPrioritySupport',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCart\" */ '@/views/Cart/PaymentSettingsPrioritySupport'),\n\t\tpath: '/cart-priority-support',\n\t\tmeta: {\n\t\t\t// layout: config.enums.Layout.PCOM,\n\t\t},\n\t},\n\t{\n\t\tname: 'Receipt',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCart\" */ '@/views/Cart/Receipt'),\n\t\tpath: '/cart-step-4',\n\t\tmeta: {\n\t\t\t// layout: config.enums.Layout.PCOM,\n\t\t},\n\t},\n\t{\n\t\tname: 'SubscriptionSettings',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCart\" */ '@/views/Cart/SubscriptionSettings'),\n\t\tpath: '/cart-step-2',\n\t\tmeta: {\n\t\t\t// layout: config.enums.Layout.PCOM,\n\t\t},\n\t},\n]","/*\n- Lots of weird redirects here\n-- Word can have an old manifest file, so any links in previous manifests should be redirected to their newer counterparts\n*/\nimport config from '@/config';\n\nexport default [\n\t// Annotated Bibliography\n\t{\n\t\tname: 'CreateAnnotatedBibliography',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkDocumentCreates\" */ '@/views/CreateAnnotatedBibliography'),\n\t\tpath: '/create-annotated-bibliography/:paperFormatUrl',\n\t\tprops: true,\n\t\tmeta: {\n\t\t\thideZendesk: true,\n\t\t\tisPaperCreate: true,\n\t\t\tpaperTypeEnum: config.enums.PaperType.APA7_AnnotatedBibliography,\n\t\t},\n\t},\n\t{\n\t\tpath: '/create-v2-annotated-bibliography/15',\n\t\tredirect: {\n\t\t\tname: 'CreateAnnotatedBibliography',\n\t\t\tparams: {\n\t\t\t\t'paperFormatUrl': 'apa-7'\n\t\t\t}\n\t\t}\n\t},\n\n\t// Discussion Post\n\t{\n\t\tname: 'CreateDiscussionPost',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkDocumentCreates\" */ '@/views/CreateDiscussionPost'),\n\t\tpath: '/create-discussion-post/:paperFormatUrl',\n\t\tprops: true,\n\t\tmeta: {\n\t\t\thideZendesk: true,\n\t\t\tisPaperCreate: true,\n\t\t\tpaperTypeEnum: config.enums.PaperType.APA7_DiscussionPost,\n\t\t},\n\t},\n\t{\n\t\tpath: '/create-v2-discussion-post/13',\n\t\tredirect: {\n\t\t\tname: 'CreateDiscussionPost',\n\t\t\tparams: {\n\t\t\t\t'paperFormatUrl': 'apa-7'\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\tpath: '/create-discussion-post/apa7',\n\t\tredirect: {\n\t\t\tname: 'CreateDiscussionPost',\n\t\t\tparams: {\n\t\t\t\t'paperFormatUrl': 'apa-7'\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\tpath: '/create-document/apa/discussion',\n\t\tredirect: {\n\t\t\tname: 'UpdateRedirect',\n\t\t}\n\t},\n\t{\n\t\tpath: '/create-document/mla/discussion',\n\t\tredirect: {\n\t\t\tname: 'UpdateRedirect',\n\t\t}\n\t},\n\n\t// Other\n\t{\n\t\tname: 'CreateOther',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkDocumentCreates\" */ '@/views/CreateOther'),\n\t\tpath: '/create-other',\n\t\tmeta: {\n\t\t\thideZendesk: true,\n\t\t},\n\t},\n\t{\n\t\tpath: '/create-v2-other',\n\t\tredirect: {\n\t\t\tname: 'CreateOther',\n\t\t}\n\t},\n\t{\n\t\tpath: '/convert-document',\n\t\tredirect: {\n\t\t\tname: 'CreateOther'\n\t\t},\n\t},\n\n\t// Reference List\n\t{\n\t\tname: 'CreateReferenceList',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkDocumentCreates\" */ '@/views/CreateReferenceList'),\n\t\tpath: '/create-reference-list/:paperFormatUrl',\n\t\tprops: true,\n\t\tmeta: {\n\t\t\thideZendesk: true,\n\t\t\tisPaperCreate: true,\n\t\t\tpaperTypeEnum: config.enums.PaperType.APA7_ReferenceList,\n\t\t},\n\t},\n\t{\n\t\tpath: '/create-v2-reference-list/14',\n\t\tredirect: {\n\t\t\tname: 'CreateReferenceList',\n\t\t\tparams: {\n\t\t\t\t'paperFormatUrl': 'apa-7'\n\t\t\t}\n\t\t}\n\t},\n\n\t// Research Paper\n\t{\n\t\tname: 'CreateResearchPaper',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkDocumentCreates\" */ '@/views/CreateResearchPaper'),\n\t\tpath: '/create-research-paper/:paperFormatUrl',\n\t\tprops: true,\n\t\tmeta: {\n\t\t\thideZendesk: true,\n\t\t\tisPaperCreate: true,\n\t\t\tpaperTypeEnum: config.enums.PaperType.APA7_StudentPaper,\t// default to Student since it's the most common and first tab on that view\n\t\t},\n\t},\n\t{\n\t\tpath: '/create-paper-apa7',\n\t\tredirect: {\n\t\t\tname: 'UpdateRedirect',\n\t\t}\n\t},\n\t{\n\t\tpath: '/create-v2-research-paper/11',\n\t\tredirect: {\n\t\t\tname: 'CreateResearchPaper',\n\t\t\tparams: {\n\t\t\t\t'paperFormatUrl': 'apa-7'\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\tpath: '/create-document/apa/research',\n\t\tredirect: {\n\t\t\tname: 'UpdateRedirect',\n\t\t}\n\t},\n\t\n\t{\n\t\tpath: '/create-document/mla/research',\n\t\tredirect: {\n\t\t\tname: 'UpdateRedirect',\n\t\t}\n\t},\n\t\n\t{\n\t\tname: 'CreateAPA6Paper',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkDocumentCreates\" */ '@/views/CreateAPA6Paper'),\n\t\tpath: '/create-apa6-research-paper',\n\t\tmeta: {\n\t\t\thideZendesk: true,\n\t\t\tisPaperCreate: true,\n\t\t},\n\t},\n\t{\n\t\tname: 'CreateMLA8Paper',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkDocumentCreates\" */ '@/views/CreateMLA8Paper'),\n\t\tpath: '/create-mla8-research-paper',\n\t\tmeta: {\n\t\t\thideZendesk: true,\n\t\t\tisPaperCreate: true,\n\t\t},\n\t},\n\t{\n\t\tname: 'CreateBetaTurabian9',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkDocumentCreates\" */ '@/views/CreateBetaTurabian9'),\n\t\tpath: '/create-beta-turabian-9',\n\t\tmeta: {\n\t\t\thideZendesk: true,\n\t\t\tisPaperCreate: true,\n\t\t\tpaperTypeEnum: config.enums.PaperType.Turabian9_ResearchPaper,\t// default to Student since it's the most common and first tab on that view\n\t\t},\n\t},\n\n\n\t// Misc. and Landings\n\t{\n\t\tname:'DocumentCreateLanding',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkDocumentCreates\" */ '@/views/DocumentCreateLanding'),\n\t\tpath: '/document-create-landing',\n\t\tmeta: {\n\t\t\thideZendesk: true,\n\t\t},\n\t},\n\t{\n\t\tname: 'DocumentCreateSuccess',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkDocumentCreates\" */ '@/views/DocumentCreateSuccess'),\n\t\tpath: '/document-create-success',\n\t},\n\t\n]","export default [\n\t{\n\t\tname: 'CitationAddEdit',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/CitationAddEdit'),\n\t\tpath: '/citation/:mode',\n\t\tprops: true,\n\t\tmeta: {\n\t\t\thideZendesk: true,\n\t\t\trequiresPerrla: true\n\t\t},\n\t},\n\t{\n\t\tname: 'CitationAddEditGenesis',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/CitationAddEditV2Genesis'),\n\t\tpath: '/citation-genesis/:mode',\n\t\tprops: true,\n\t\tmeta: {\n\t\t\thideZendesk: true,\n\t\t\trequiresPerrla: true\n\t\t},\t\t\t\n\t},\n\t{\n\t\tname: 'ConvertGenesisStep1',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/AddFromLibrary/ConvertGenesisStep1'),\n\t\tpath: '/reference-convert-genesis-1',\n\t\tmeta: {\n\t\t\thideZendesk: true,\n\t\t\trequiresPerrla: true\n\t\t},\n\t},\n\t{\n\t\tname: 'ConvertGenesisStep2',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/AddFromLibrary/ConvertGenesisStep2'),\n\t\tpath: '/reference-convert-genesis-2',\n\t\tmeta: { hideZendesk: true, requiresPerrla: true},\n\t},\n\n\t{\n\t\tname: 'CreateReferenceStep1',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/CreateReference/Step1'),\n\t\tpath: '/create-reference-1',\n\t\tmeta: { hideZendesk: true, requiresPerrla: true},\n\t},\n\t{\n\t\tname: 'CreateGenesisReferenceStep1',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/CreateReference/GenesisStep1'),\n\t\tpath: '/create-genesis-reference-1/:openReferenceTab',\n\t\tprops: true,\n\t\tmeta: { hideZendesk: true, requiresPerrla: true},\t\t\t\n\t},\n\t{\n\t\tname: 'CreateReferenceStep2',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/CreateReference/Step2'),\n\t\tpath: '/create-reference-2',\n\t\tmeta: { hideZendesk: true, requiresPerrla: true},\n\t},\n\t{\n\t\tname: 'CreateGenesisReferenceStep2',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/CreateReference/GenesisStep2'),\n\t\tpath: '/create-genesis-reference-2/:openReferenceTab/:referenceTypeSlug',\n\t\tprops: true,\n\t\tmeta: { hideZendesk: true, requiresPerrla: true},\n\t},\n\t{\n\t\tname: 'CreateStep2ThirdParty',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/CreateReference/Step2ThirdParty'),\n\t\tpath: '/create-genesis-reference-2-3plu',\n\t\tmeta: { hideZendesk: true, requiresPerrla: true},\t\t\t\n\t},\n\t{\n\t\tname: 'CreateReferenceStep3',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/CreateReference/Step3'),\n\t\tpath: '/create-reference-3',\n\t\tmeta: { hideZendesk: true, requiresPerrla: true},\n\t},\n\t{\n\t\tname: 'CreateGenesisReferenceStep3',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/CreateReference/GenesisStep3'),\n\t\tpath: '/create-genesis-reference-3/:openReferenceTab/:referenceTypeSlug',\n\t\tprops: true,\n\t\tmeta: { hideZendesk: true, requiresPerrla: true},\n\t},\n\t{\n\t\tname: 'CreateStep3ThirdParty',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/CreateReference/Step3ThirdParty'),\n\t\tpath: '/create-genesis-reference-3-3plu',\n\t\tmeta: { hideZendesk: true, requiresPerrla: true},\n\t},\n\t{\n\t\tname: 'CreateStep4ThirdParty',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/CreateReference/Step4ThirdParty'),\n\t\tpath: '/create-genesis-reference-4-3plu',\n\t\tmeta: { hideZendesk: true, requiresPerrla: true},\n\t},\n\n\t{\n\t\tname: 'ReferenceAddFromLibrary',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/AddFromLibrary'),\n\t\tpath: '/reference-add-from-library',\n\t\tmeta: { hideZendesk: true, requiresPerrla: true},\n\t},\n\t{\n\t\tname: 'ReferenceEdit',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/ReferenceEdit'),\n\t\tpath: '/reference-edit',\n\t\tmeta: { hideZendesk: true, requiresPerrla: true},\n\t},\n\t{\n\t\tname: 'ReferenceEditGenesis',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/ReferenceEditGenesis'),\n\t\tpath: '/reference-edit-genesis',\n\t\tmeta: { hideZendesk: true, requiresPerrla: true},\n\t},\n\t{\n\t\tname: 'ReferenceReviewGenesis',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations/ReferenceReviewGenesis'),\n\t\tpath: '/reference-review-genesis',\n\t\tmeta: { hideZendesk: true, requiresPerrla: true},\n\t},\n\t{\n\t\tname: 'ReferencesCitations',\n\t\tcomponent: () => import(/* webpackChunkName: \"ChunkReferences\" */ '@/views/ReferencesCitations'),\n\t\tpath: '/references-citations',\n\t\tmeta: {\n\t\t\tcleanCopyRedirect: true,\n\t\t\thideZendesk: true,\n\t\t\trequiresPerrla: true\n\t\t},\n\t},\n\t\n]","import _has from 'lodash/has';\nimport AS_InitTooltips from '@/services/app/initTooltips';\nimport config from '@/config.js'\nimport { isBefore } from 'date-fns'\nimport store from '@/store'\nimport Vue from 'vue';\nimport VueRouter from 'vue-router';\nimport WordDocProps from '@/helpers/word-document-props.js';\nVue.use(VueRouter);\n\n// modules\nimport cart from \"./modules/cart\";\nimport documentCreates from \"./documentCreates\";\nimport reference from \"./reference\";\n\nconst router = new VueRouter({\n\troutes: [\n\t\t{\n\t\t\tname: 'AdvancedEditing',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/AdvancedEditing'),\n\t\t\tpath: '/advanced-editing',\n\t\t\tmeta: { hideZendesk: true, requiresPerrla: true},\n\t\t},\n\t\t...cart,\n\t\t{\n\t\t\tname: 'CartDialog',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/CartDialog'),\n\t\t\tpath: '/cart-dialog',\n\t\t},\n\t\t...documentCreates,\n\t\t\n\t\t{\n\t\t\tname: 'CleanCopyRedirect',\t// a landing page for when a user opens their Clean Paper in word\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/CleanCopyRedirect'),\n\t\t\tpath: '/create-clean-copy-redirect',\n\t\t},\n\t\t{\n\t\t\tname: 'CreateCleanCopy',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/CreateCleanCopy'),\n\t\t\tpath: '/create-clean-copy',\n\t\t\tmeta:{\n\t\t\t\tcleanCopyRedirect: true,\n\t\t\t\trequiresPerrla: true\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"ErrorTests\",\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/ErrorTests'),\n\t\t\tpath: '/error-tests',\n\t\t\tmeta: { hideZendesk: true},\n\t\t},\n\t\t{\n\t\t\tname: \"DeveloperTools\",\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/DeveloperTools'),\n\t\t\tpath: '/developer-tools',\n\t\t\tmeta: { hideZendesk: true},\n\t\t},\n\t\t{\n\t\t\tname: 'Error',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/Error'),\n\t\t\tpath: '/error/:errorType',\n\t\t\tprops: true,\n\t\t},\n\t\t// Redirect (no component / beforeEach redirects to Oidc) - setup this way to OAuth server has a url to go to after successful login\n\t\t{\n\t\t\tname: 'Redirect',\n\t\t\tpath: '/redirect',\n\t\t\tbeforeEnter: (to, from, next) => {\n\t\t\t\tif(to.query.access_token){\n\t\t\t\t\t// valid - store the tokens\n\t\t\t\t\tstore.commit('api/SET_TOKEN', to.query.access_token);\n\n\t\t\t\t\tlocalStorage.setItem('pc_token_new_after_redirect', to.query.access_token);\n\t\t\t\t\tlocalStorage.setItem('pc_junk_new_after_redirect', 'junk');\n\n\t\t\t\t\tif(to.query.id_token){\n\t\t\t\t\t\tstore.commit('idToken', to.query.id_token);\n\t\t\t\t\t}\n\n\t\t\t\t\tif(store.state.redirectTo){\n\t\t\t\t\t\t// redirect to wherever the user was trying to go (then remove)\n\t\t\t\t\t\tlet redirectTemp = store.state.redirectTo;\n\t\t\t\t\t\tstore.commit('redirectTo', '');\n\t\t\t\t\t\trouter.push({\n\t\t\t\t\t\t\tpath: redirectTemp\n\t\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// there isn't a redirect stored but the user was sent here becasue their token was bad - fully log them out\n\t\t\t\t\t\tstore.commit('api/SET_TOKEN', '');\n\t\t\t\t\t\tstore.commit('idToken', '');\n\t\t\t\t\t\tstore.commit('customer/SET_EMAIL', '');\n\t\t\t\t\t\tstore.commit('customer/SET_EXPIRATION_DATE', '');\n\t\t\t\t\t\tstore.commit('customer/SET_FIRST_NAME', '');\n\t\t\t\t\t\tstore.commit('customer/SET_ID', '0');\n\t\t\t\t\t\tstore.commit('customer/SET_INSTITUTION', '');\n\t\t\t\t\t\tstore.commit('customer/SET_LAST_NAME', '');\n\n\t\t\t\t\t\t// issue with support impersonating then logging out, but the system keeps previous user's references\n\t\t\t\t\t\tstore.commit('LAST_SYNC_DATE', '');\n\t\t\t\t\t\tstore.commit('REFERENCE_LIBRARY', []);\n\t\t\t\t\t\tstore.commit('refLibCompString', '');\n\t\t\t\t\t\tstore.commit('REFERENCE_LIBRARY_GENESIS', []);\n\t\t\t\t\t\tstore.commit('refLibCompStringGenesis', '');\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// invalid ?\n\t\t\t\t\trouter.push({\n\t\t\t\t\t\tname: 'Login'\n\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t}\n\t\t\t}//e:beforeEnter\n\t\t},\n\t\t{\n\t\t\tname: 'ForgotPassword',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/ForgotPassword'),\n\t\t\tpath: '/forgot-password',\n\t\t},\n\t\t{\n\t\t\tname: 'FreeTrialStart',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/FreeTrialStart'),\n\t\t\tpath: '/free-trial-start',\n\t\t},\n\t\t{\n\t\t\tname: 'FreeTrialVerify',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/FreeTrialVerify'),\n\t\t\tpath: '/free-trial-verify/:verifyId',\n\t\t\tprops: true,\n\t\t},\n\t\t{\n\t\t\tname: 'FreeTrialAlternateEmail',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/FreeTrialAlternateEmail'),\n\t\t\tpath: '/free-trial-alternate-email',\n\t\t},\n\t\t{\n\t\t\tname: 'GettingStarted',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/GettingStarted'),\n\t\t\tpath: '/getting-started',\n\t\t},\n\t\t{\n\t\t\tname: 'InsertFigure',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/InsertFigure'),\n\t\t\tpath: '/figure',\n\t\t\tmeta: {\n\t\t\t\tcleanCopyRedirect: true,\n\t\t\t\trequiresPerrla: true\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: 'InsertTable',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/InsertTable'),\n\t\t\tpath: '/table',\n\t\t\tmeta: {\n\t\t\t\tcleanCopyRedirect: true,\n\t\t\t\trequiresPerrla: true\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: 'Login',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/Login'),\n\t\t\tpath: '/login',\n\t\t},\n\t\t{\n\t\t\tname: 'PaperReview',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/PaperReview'),\n\t\t\tpath: '/paper-review',\n\t\t\tmeta: {\n\t\t\t\tcleanCopyRedirect: true,\n\t\t\t\thideZendesk: true,\n\t\t\t\trequiresAuth: true,\n\t\t\t\trequiresPerrla: true,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: 'PaperSectionsAbstract',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/PaperAbstract'),\n\t\t\tpath: '/paper-sections-abstract',\n\t\t\tmeta: {\n\t\t\t\tcleanCopyRedirect: true,\n\t\t\t\trequiresPerrla: true\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: 'PaperSectionsAppendix',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/PaperAppendix'),\n\t\t\tpath: '/paper-sections-appendix',\n\t\t\tmeta: {\n\t\t\t\tcleanCopyRedirect: true,\n\t\t\t\trequiresPerrla: true\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: 'PaperSectionsTitlePage',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/PaperTitlePage'),\n\t\t\tpath: '/paper-sections-title-page',\n\t\t\tmeta: {\n\t\t\t\tcleanCopyRedirect: true,\n\t\t\t\trequiresPerrla: true\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: 'PaperSectionsToc',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/PaperToc'),\n\t\t\tpath: '/paper-sections-toc',\n\t\t\tmeta: {\n\t\t\t\tcleanCopyRedirect: true,\n\t\t\t\trequiresPerrla: true\n\t\t\t},\n\t\t},\n\t\t...reference,\n\t\t{\n\t\t\tname: 'ResearchNotes',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/ResearchNotes'),\n\t\t\tpath: '/research-notes',\n\t\t\tmeta: {\n\t\t\t\tcleanCopyRedirect: true,\n\t\t\t\trequiresPerrla: true\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: 'Settings',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/Settings'),\n\t\t\tpath: '/settings',\n\t\t\tmeta: { hideZendesk: true },\n\t\t},\n\t\t{\n\t\t\tname: 'SettingsUpdateConfirmation',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/Settings/UpdateConfirmation'),\n\t\t\tpath: '/settings-update-confirmation',\n\t\t\tmeta: { hideZendesk: true },\n\t\t},\n\t\t{\n\t\t\tname: 'Startup',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/Startup'),\n\t\t\tpath: '/startup',\n\t\t\tmeta: {hideZendesk: true},\n\t\t},\n\t\t{\n\t\t\tname: 'SubscriptionExpired',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/SubscriptionExpired'),\n\t\t\tpath: '/expired-subscription',\n\t\t},\n\t\t{\n\t\t\tname: 'TextStyles',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/TextStyles'),\n\t\t\tpath: '/text-styles',\n\t\t\tmeta: {\n\t\t\t\tcleanCopyRedirect: true,\n\t\t\t\trequiresPerrla: true\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: 'Tutorial',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/Tutorial'),\n\t\t\tpath: '/tutorial',\n\t\t\tmeta: { hideZendesk: true},\n\t\t},\n\t\t{\n\t\t\tname: 'UnsupportedBrowser',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/UnsupportedBrowser'),\n\t\t\tpath: '/unsupported-browser',\n\t\t},\n\n\t\t{\n\t\t\tname: 'UnsupportedPlatform',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/UnsupportedPlatform'),\n\t\t\tpath: '/unsupported-platform',\n\t\t},\n\t\t{\n\t\t\tname: 'UpdateRedirect',\n\t\t\tcomponent: () => import(/* webpackChunkName: \"ChunkCore\" */ '@/views/UpdateRedirect'),\n\t\t\tpath: '/update-redirect',\n\t\t},\n\t]\n});\n\n// Guard\n// * note requiresPerrla by default implicitly requires auth as well\nrouter.beforeEach((to, from, next) => {\n\t// Check if Connected\n\tif(navigator.onLine){\n\t\t// Connected\n\t\tif(Office.context.platform == 'OfficeOnline' && config.isLive){\n\t\t\t// Office Online - redirect\n\t\t\tif(to.name === 'UnsupportedPlatform'){\n\t\t\t\tnext();\n\t\t\t} else {\n\t\t\t\trouter.push({\n\t\t\t\t\tname:'UnsupportedPlatform'\n\t\t\t\t}).catch(()=>{});\n\t\t\t}\n\t\t} else {\n\t\t\t// Not OfficeOnline - should work\n\t\t\tif(to.path === '/help'){\n\t\t\t\t// Catch Help and redirect (manifest safeguard)\n\t\t\t\twindow.location = 'https://perrla.zendesk.com/hc/en-us/categories/360001366714-PERRLA-Add-in-BETA-';\n\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\t// Require Login (or Perrla Paper or Clean Copy Redirect)\n\t\t\t\tif (to.matched.some(record => record.meta.requiresAuth) || to.matched.some(record => record.meta.cleanCopyRedirect) || to.matched.some(record => record.meta.requiresPerrla)) {\n\n\t\t\t\t\t// Has this user created a paper yet (it marks as true on the last tutorial slide)\n\t\t\t\t\tif(store.state.hasCreatedPaper){\n\t\t\t\t\t\t// Yes has created paper\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Check for Perrla Paper\n\t\t\t\t\t\tif (to.matched.some(record => record.meta.requiresPerrla)) {\n\t\t\t\t\t\t\t// Requires Perrla Paper\n\n\t\t\t\t\t\t\t// A perrla paper should first require the user to be logged in\n\t\t\t\t\t\t\t// Check for Login\n\t\t\t\t\t\t\tif(store.state.api.token == ''){\n\t\t\t\t\t\t\t\t// No Token Set (user is not logged in)\n\t\t\t\t\t\t\t\tstore.commit('redirectTo', to.path);\n\t\t\t\t\n\t\t\t\t\t\t\t\trouter.push({\n\t\t\t\t\t\t\t\t\tname: 'Login'\n\t\t\t\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Token Set (user is logged in)\n\t\t\t\t\t\t\t\tWordDocProps.getCustomProp('PaperGUID').then((value)=>{\n\t\t\t\t\t\t\t\t\t// Perrla Paper\n\n\t\t\t\t\t\t\t\t\t// Check subscription expiration date\n\t\t\t\t\t\t\t\t\tconst dateObj = new Date(store.state.customer.expirationDate);\n\t\t\t\t\t\t\t\t\tdateObj.setHours(0, 0, 0, 0);\n\n\t\t\t\t\t\t\t\t\tif(isBefore(dateObj, config.today)){ //2099-01-01T00:00:00\n\t\t\t\t\t\t\t\t\t\tif(window.$vm.$route.name === 'Settings'){\n\t\t\t\t\t\t\t\t\t\t\t// user is still expired and on the expired page\n\t\t\t\t\t\t\t\t\t\t\tstore.commit('loaders/REMOVE_ID', 'App');\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\trouter.push({\n\t\t\t\t\t\t\t\t\t\t\t\tname:'Settings'\n\t\t\t\t\t\t\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tnext();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}).catch(()=>{\n\t\t\t\t\t\t\t\t\tif(to.matched.some(record => record.meta.cleanCopyRedirect)){\n\t\t\t\t\t\t\t\t\t\t// check if this is really a clean copy or not\n\t\t\t\t\t\t\t\t\t\tWordDocProps.getAllCustomProps().then((allProps)=>{\n\t\t\t\t\t\t\t\t\t\t\tif(\n\t\t\t\t\t\t\t\t\t\t\t\t(_has(allProps, 'PERRLAExportAsNormal') && allProps.PERRLAExportAsNormal) ||\t// PO Simplified\n\t\t\t\t\t\t\t\t\t\t\t\t(_has(allProps, 'ConvertedToSimple') && allProps.ConvertedToSimple)\t\t\t\t// Add-In Clean Copy\n\t\t\t\t\t\t\t\t\t\t\t){\n\t\t\t\t\t\t\t\t\t\t\t\trouter.push({\n\t\t\t\t\t\t\t\t\t\t\t\t\tname: 'CleanCopyRedirect'\n\t\t\t\t\t\t\t\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\trouter.push({\n\t\t\t\t\t\t\t\t\t\t\t\t\tname: 'GettingStarted'\n\t\t\t\t\t\t\t\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});//allProps\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t// Not Perrla Paper\n\t\t\t\t\t\t\t\t\t\trouter.push({\n\t\t\t\t\t\t\t\t\t\t\tname: 'GettingStarted'\n\t\t\t\t\t\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Does Not Require Perrla Paper\n\n\t\t\t\t\t\t\t// Check for Login\n\t\t\t\t\t\t\tif(store.state.api.token == ''){\n\t\t\t\t\t\t\t\t// No Token Set (user is not logged in)\n\t\t\t\t\t\t\t\tstore.commit('redirectTo', to.path);\n\n\t\t\t\t\t\t\t\trouter.push({\n\t\t\t\t\t\t\t\t\tname: 'Login'\n\t\t\t\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Token Set (user is logged in)\n\t\t\t\t\t\t\t\tnext();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}//e:if:perrla paper\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No has not created paper (force tutorial)\n\t\t\t\t\t\trouter.push({\n\t\t\t\t\t\t\tname:'Tutorial'\n\t\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\t// Does Not Require Login or Perrla Paper (Catch all, not sure what would use this)\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Not Connected\n\t\tif(to.name === 'error'){\n\t\t\tnext();\n\t\t} else {\n\t\t\trouter.push({\n\t\t\t\tname:'Error',\n\t\t\t\tparams:{\n\t\t\t\t\terrorType: 'connection'\n\t\t\t\t},\n\t\t\t}).catch(()=>{});\n\t\t}\n\t}\n});//e:router.beforeEach\n\nrouter.afterEach((to, from) => {\n\t// close any open sidemenus\n\tstore.commit('isSidebarOpen', false);\n\tstore.commit('forms/SET_VALIDATION', []);\n\twindow.$vm.emitter.emit('toasterClose');\n\n\tAS_InitTooltips();\n\t\n\twindow.scrollTo(0,0);\n});//e:router.afterEach\n\nexport default router;","/*\n- ApiS_MakeCall\n-- Makes an API call to the server\n-- 2023.11.27\n*/\n\nimport _has from 'lodash/has';\nimport _merge from 'lodash/merge';\nimport AS_CheckToken from '@/services/app/checkToken';\nimport config from '@/config';\nimport router from '@/router';\nimport store from '@/store';\nimport Swal from 'sweetalert2';\n\nexport default ($opts) => {\n\treturn new Promise((resolve, reject) => {\n\t\n\t\tlet isRejectWithMessage = false;\n\t\t\n\t\t// structure this api call as a promise so if it fails for specific reasons i can correct them and try again\n\t\tlet makeTheApiCall = () =>{\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t// console.log('ApiS_MakeCall');\n\t\t\t\t\n\t\t\t\tisRejectWithMessage = false;\n\t\t\t\t\n\t\t\t\tlet _contentType = _has($opts, 'contentType') ? $opts.contentType : 'application/json';\n\t\t\t\tlet _ignoreAuth = _has($opts, 'ignoreAuth') ? $opts.ignoreAuth : false;\n\t\t\t\tlet _outsideSpa = _has($opts, 'outsideSpa') ? $opts.outsideSpa : false;\n\t\t\t\tlet _responseType = _has($opts, 'responseType') ? $opts.responseType : 'none';\n\t\t\t\t\n\t\t\t\tlet requestParams = {\n\t\t\t\t\tcache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached\n\t\t\t\t\tmethod: $opts.method,\n\t\t\t\t};\n\n\t\t\t\tlet sourceAppOutput = '';\n\t\t\t\tlet wordVersionOutput = '';\n\t\t\t\tif(config.platformId === config.enums.Platform.ADD_IN){\n\t\t\t\t\tsourceAppOutput = 'WordAddIn'\n\t\t\t\t\twordVersionOutput = Office.context.diagnostics.version;\n\t\t\t\t} else if(config.platformId === config.enums.Platform.ONLINE){\n\t\t\t\t\tsourceAppOutput = 'Online'\n\t\t\t\t}\n\n\t\t\t\t// build headers\n\t\t\t\tlet headerObject = {\n\t\t\t\t\t'Browser': store.state.api.browserName,\n\t\t\t\t\t'BrowserVersion': store.state.api.browserVersion,\n\t\t\t\t\t'Cache-Control': 'no-store, max-age=0',\n\t\t\t\t\t'Content-Type': _contentType,\n\t\t\t\t\t'CustomerID': store.state.api.customerId,\n\t\t\t\t\t'IsImpersonating': store.state.customer.isImpersonating,\n\t\t\t\t\t'organizationExpirationDate': store.state.customer.organizationExpirationDate,\n\t\t\t\t\t'organizationID': store.state.customer.organizationId,\n\t\t\t\t\t'organizationStatusID': store.state.customer.organizationStatusId,\n\t\t\t\t\t'OS': store.state.api.osName,\n\t\t\t\t\t'OSVersion': store.state.api.osVersion,\n\t\t\t\t\t'SessionID': store.state.api.sessionId,\n\t\t\t\t\t'SourceApp': sourceAppOutput,\n\t\t\t\t\t'SourceAppVersion': VERSION,\n\t\t\t\t\t'WordVersion': wordVersionOutput\n\t\t\t\t}\n\n\t\t\t\t// add url \n\t\t\t\tlet _url;\n\n\t\t\t\t// a hard url gets a full url from the opts instead of getting built based on the app\n\t\t\t\tif($opts.isHardUrl){\n\t\t\t\t\t_url = new URL($opts.url);\n\t\t\t\t} else {\n\t\t\t\t\tif (_outsideSpa) {\n\t\t\t\t\t\t// legacy items won't have an api, so route directly in to the MVC project\n\t\t\t\t\t\t_url = new URL(config.appUrl);\n\t\t\t\t\t\t_url.href += $opts.url;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(config.isLive){\n\t\t\t\t\t\t\t_url = new URL('https://api.perrla.com');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t_url = new URL('https://testapi.perrla.com');\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t_url.href += $opts.url;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(!_ignoreAuth){\n\t\t\t\t\t_merge(headerObject, {\n\t\t\t\t\t\t'Authorization': \"Bearer \" + store.state.api.token\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// add url params\n\t\t\t\tif($opts.params){\n\t\t\t\t\t_url.search = new URLSearchParams($opts.params);\n\t\t\t\t}\n\n\t\t\t\trequestParams.headers = new Headers(headerObject);\n\n\t\t\t\t// add body\n\t\t\t\tif($opts.body){\n\t\t\t\t\tif(typeof $opts.body === 'string'){\n\t\t\t\t\t\trequestParams.body = $opts.body;\n\t\t\t\t\t} else {\n\t\t\t\t\t\trequestParams.body = JSON.stringify($opts.body);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// use Fetch API\n\t\t\t\tfetch(new Request(_url, requestParams)).then((response) => {\n\t\t\t\t\t// this first then() inside fetch just parses the data and returned it to the next then()\n\t\t\t\t\tif (response.ok) {\n\t\t\t\t\t\t// Success\n\t\t\t\t\t\tif(_responseType === 'arraybuffer'){\n\t\t\t\t\t\t\treturn response.arrayBuffer();\n\t\t\t\t\t\t} else if(_responseType === 'json'){\n\t\t\t\t\t\t\treturn response.json();\n\t\t\t\t\t\t} else if(_responseType === 'text'){\n\t\t\t\t\t\t\treturn response.text();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// an api call that doesn't have or care about the result\n\t\t\t\t\t\t\treturn response;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Fail\n\t\t\t\t\t\tif(response.status == 400){\n\t\t\t\t\t\t\t// bad request\n\t\t\t\t\t\t\treturn reject('Bad Request');\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t} else if(response.status == 401){\n\t\t\t\t\t\t\t// user is unauthorized\n\t\t\t\t\t\t\treturn reject('Token Expired');\n\t\t\t\t\t\t\n\t\t\t\t\t\t} else if(response.status == 404){\n\t\t\t\t\t\t\tSwal.fire({\n\t\t\t\t\t\t\t\tbuttonsStyling: false,\n\t\t\t\t\t\t\t\ttext: '404 - There was an error processing this request',\n\t\t\t\t\t\t\t\ticon: 'error',\n\t\t\t\t\t\t\t\tconfirmButtonText: 'Ok',\n\t\t\t\t\t\t\t\tshowCloseButton: false,\n\t\t\t\t\t\t\t\tshowConfirmButton: true,\n\t\t\t\t\t\t\t\tcustomClass:{\n\t\t\t\t\t\t\t\t\tconfirmButton: 'btn btn-danger me-2',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}).then((result) => {\n\t\t\t\t\t\t\t\tif (result.value) {\n\t\t\t\t\t\t\t\t\t// reject(responseData[0].message);\n\t\t\t\t\t\t\t\t\treturn reject('404');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t} else if(response.status == 500){\n\t\t\t\t\t\t\t// server error - return a text result\n\t\t\t\t\t\t\tisRejectWithMessage = true;\n\t\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Other\n\t\t\t\t\t\t\t// generic error - usually a 404 at this point\n\t\t\t\t\t\t\tlet responseError = '';\n\t\t\t\t\t\t\tif(response.status){\n\t\t\t\t\t\t\t\tresponseError += response.status + ' ';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(response.statusText){\n\t\t\t\t\t\t\t\tresponseError += response.statusText;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn reject(responseError);\n\n\t\t\t\t\t\t}//e:else\n\n\t\t\t\t\t}//e:if:response.ok\n\n\t\t\t\t}).then((responseData) => {\n\t\t\t\t\t// data is processed earlier, this then() resolves this makeTheApiCall promise \n\t\t\t\t\tif(isRejectWithMessage){\n\t\t\t\t\t\t// 500 errors return a reason why, pass the first one off to show here\n\t\t\t\t\t\tlet handleErrorAtSource = false;\n\t\t\t\t\t\tlet messageOutput = '';\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(config.platformId === config.enums.Platform.ADD_IN){\n\t\t\t\t\t\t\t// 500 errors return a reason why, pass the first one off to show here\n\t\t\t\t\t\t\tif($opts.url === 'v4/PaymentMethod' && $opts.method === 'GET'){\n\t\t\t\t\t\t\t\tswitch(responseData[0].code){\n\t\t\t\t\t\t\t\t\tcase \"NO_VALID_METHODS\":\n\t\t\t\t\t\t\t\t\t\thandleErrorAtSource = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tmessageOutput = responseData[0].message;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t} else if($opts.url === 'v4/PaymentMethod' && $opts.method === 'POST'){\n\t\t\t\t\t\t\t\tswitch(responseData[0].code){\n\t\t\t\t\t\t\t\t\tcase 'AUTH_PROFILE':\n\t\t\t\t\t\t\t\t\t\thandleErrorAtSource = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tmessageOutput = responseData[0].message;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else if($opts.url === 'v4/Purchase' && $opts.method === 'POST'){\n\t\t\t\t\t\t\t\tswitch(responseData[0].code){\n\t\t\t\t\t\t\t\t\tcase 'AUTH_PROFILE':\n\t\t\t\t\t\t\t\t\t\thandleErrorAtSource = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tmessageOutput = responseData[0].message;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tswitch(responseData[0].code){\n\t\t\t\t\t\t\t\t\tcase \"ALREADY_CUSTOMER\":\n\t\t\t\t\t\t\t\t\t\tmessageOutput = 'This email is already being used for a PERRLA Account.';\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'CUSTOMER_NOT_IN_TRIAL':\n\t\t\t\t\t\t\t\t\t\t// v4/FreeTrial/Discount\n\t\t\t\t\t\t\t\t\t\thandleErrorAtSource = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'DISCOUNT_EXISTS':\n\t\t\t\t\t\t\t\t\t\t// v4/FreeTrial/Discount\n\t\t\t\t\t\t\t\t\t\thandleErrorAtSource = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase \"INVALID_CODE\":\n\t\t\t\t\t\t\t\t\t\tmessageOutput = 'Invalid code: Try again or contact our Support Team if you continue to have trouble (support@perrla.com).';\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'TRIAL_EXPIRED':\n\t\t\t\t\t\t\t\t\t\t// v4/FreeTrial/Discount\n\t\t\t\t\t\t\t\t\t\thandleErrorAtSource = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tmessageOutput = responseData[0].message;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if(config.platformId === config.enums.Platform.ONLINE){\n\t\t\t\t\t\t\t// Online has checks for the url a user is trying to access\n\t\t\t\t\t\t\tif($opts.url === 'v4/CohortUser/Activate' && $opts.method === 'GET'){\n\t\t\t\t\t\t\t\tswitch(responseData[0].code){\n\t\t\t\t\t\t\t\t\tcase \"EXPIRED_ORG\":\n\t\t\t\t\t\t\t\t\tcase \"INVALID_ID\":\n\t\t\t\t\t\t\t\t\tcase \"INVALID_ORG\":\n\t\t\t\t\t\t\t\t\tcase \"ORG_CAPACITY_REACHED\":\n\t\t\t\t\t\t\t\t\tcase \"USER_ALREADY_CREATED\":\n\t\t\t\t\t\t\t\t\tcase \"USER_DELETED\":\n\t\t\t\t\t\t\t\t\t\thandleErrorAtSource = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tmessageOutput = responseData[0].message;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if($opts.url === 'v4/FreeTrial'){\n\t\t\t\t\t\t\t\tswitch(responseData[0].code){\n\t\t\t\t\t\t\t\t\tcase 'PENDING_ORG_INVITE':\n\t\t\t\t\t\t\t\t\t\thandleErrorAtSource = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tmessageOutput = responseData[0].message;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if($opts.url === 'v4/Purchase' && $opts.method === 'POST'){\t\t\n\t\t\t\t\t\t\t\tswitch(responseData[0].code){\n\t\t\t\t\t\t\t\t\tcase 'AUTH_PROFILE':\n\t\t\t\t\t\t\t\t\t\thandleErrorAtSource = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tmessageOutput = responseData[0].message;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if($opts.url === 'v4/Purchase/User' && $opts.method === 'POST'){\n\t\t\t\t\t\t\t\tswitch(responseData[0].code){\n\t\t\t\t\t\t\t\t\tcase 'ALREADY_CUSTOMER_INVALID':\n\t\t\t\t\t\t\t\t\tcase 'ALREADY_CUSTOMER_VALID':\n\t\t\t\t\t\t\t\t\tcase 'PENDING_INVITATION':\n\t\t\t\t\t\t\t\t\t\thandleErrorAtSource = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tconsole.log(responseData[0]);\n\t\t\t\t\t\t\t\t\t\tmessageOutput = responseData[0].message;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t} else if($opts.url === 'v4/PaymentMethod' && $opts.method === 'GET'){\n\t\t\t\t\t\t\t\tswitch(responseData[0].code){\n\t\t\t\t\t\t\t\t\tcase \"NO_VALID_METHODS\":\n\t\t\t\t\t\t\t\t\t\thandleErrorAtSource = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tmessageOutput = responseData[0].message;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tmessageOutput = responseData[0].message;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}//e:else:online\n\n\t\t\t\t\t\tif(handleErrorAtSource){\n\t\t\t\t\t\t\t// reject to source and handle the error code there\n\t\t\t\t\t\t\treject(responseData[0]);\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif(config.platformId === config.enums.Platform.ADD_IN){\n\t\t\t\t\t\t\t\twindow.$vm.emitter.emit('toasterOpen', {\n\t\t\t\t\t\t\t\t\tbody: messageOutput,\n\t\t\t\t\t\t\t\t\tisSticky: true,\n\t\t\t\t\t\t\t\t\ttitle: 'Error',\n\t\t\t\t\t\t\t\t\ttype: 'danger'\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\treject();\n\n\t\t\t\t\t\t\t} else if(config.platformId === config.enums.Platform.ONLINE){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tSwal.fire({\n\t\t\t\t\t\t\t\t\tbuttonsStyling: false,\n\t\t\t\t\t\t\t\t\ttext: responseData[0].message,\n\t\t\t\t\t\t\t\t\ticon: 'error',\n\t\t\t\t\t\t\t\t\tconfirmButtonText: 'Ok',\n\t\t\t\t\t\t\t\t\tshowCloseButton: false,\n\t\t\t\t\t\t\t\t\tshowConfirmButton: true,\n\t\t\t\t\t\t\t\t\tcustomClass:{\n\t\t\t\t\t\t\t\t\t\tconfirmButton: 'btn btn-danger me-2',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}).then((result) => {\n\t\t\t\t\t\t\t\t\tif (result.value) {\n\t\t\t\t\t\t\t\t\t\treject(responseData[0].message);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}//e:else:online\n\t\t\t\t\t\t}//e:else:handleErrorAtSource\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn resolve(responseData);\n\t\t\t\t\t}\n\n\t\t\t\t}).catch((error) => {\n\t\t\t\t\t// fetch call failed for any reason\n\t\t\t\t\tif(config.platformId === config.enums.Platform.ADD_IN){\n\t\t\t\t\t\treject(error.message);\n\n\t\t\t\t\t} else if(config.platformId === config.enums.Platform.ONLINE){\n\t\t\t\t\t\tlet failReasonDisplay = error.message;\n\t\t\t\t\t\tif(failReasonDisplay === 'Failed to fetch'){\n\t\t\t\t\t\t\tfailReasonDisplay = 'There was an error with this request. Please try again.'\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tSwal.fire({\n\t\t\t\t\t\t\tallowOutsideClick: false,\n\t\t\t\t\t\t\tbuttonsStyling: false,\n\t\t\t\t\t\t\ttext: failReasonDisplay,\n\t\t\t\t\t\t\ticon: 'error',\n\t\t\t\t\t\t\tconfirmButtonText: 'OK',\n\t\t\t\t\t\t\tshowCloseButton: false,\n\t\t\t\t\t\t\tshowConfirmButton: true,\n\t\t\t\t\t\t\tcustomClass:{\n\t\t\t\t\t\t\t\tconfirmButton: 'btn btn-danger me-2',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}).then((result) => {\n\t\t\t\t\t\t\t// if (result.value) {\n\t\t\t\t\t\t\t// \treject(failReasonDisplay);\n\t\t\t\t\t\t\t// }\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn reject(failReasonDisplay);\n\t\t\t\t\t}//e:else:online\n\t\t\t\t\t\n\t\t\t\t});//fetch.catch\n\n\t\t\t});//e:Promise\n\t\t};//e:makeTheApiCall\n\n\t\tif(navigator.onLine) {\n\t\t\tif($opts.ignoreAuth){\n\t\t\t\t// ignoreAuth - just make the call\n\t\t\t\tmakeTheApiCall($opts).then((responseData)=>{\n\t\t\t\t\t// first call success, resolve back to the original makeApiCall call\n\t\t\t\t\treturn resolve(responseData);\n\t\n\t\t\t\t}).catch((failReason)=>{\n\t\t\t\t\tconsole.log('failReason 1');\n\t\t\t\t\tconsole.log(failReason);\n\n\t\t\t\t\treturn reject(failReason);\n\t\t\t\t});//e:makeTheApiCall.then\n\n\t\t\t} else {\n\t\t\t\t// use Auth - check account\n\t\t\t\tAS_CheckToken().then((apiToken)=>{\n\t\t\t\t\tstore.commit('api/SET_TOKEN', apiToken);\n\n\t\t\t\t\tmakeTheApiCall($opts).then((responseData)=>{\n\t\t\t\t\t\t// first call success, resolve back to the original makeApiCall call\n\t\t\t\t\t\treturn resolve(responseData);\n\t\t\n\t\t\t\t\t}).catch((failReason)=>{\n\t\t\t\t\t\t// first call failed\n\t\t\t\t\t\tif(failReason === 'Token Expired'){\n\t\t\t\t\t\t\t// get a new token and make this call again\n\n\t\t\t\t\t\t\t// blank out tokens and session ids\n\t\t\t\t\t\t\tstore.commit('api/SET_SESSION_ID', '');\n\t\t\t\t\t\t\tstore.commit('api/SET_TOKEN', '');\n\n\t\t\t\t\t\t\tAS_CheckToken().then((apiToken)=>{\n\t\t\t\t\t\t\t\t// clone the original options since i need to make this call one more time\n\t\t\t\t\t\t\t\tlet clonedOpts = {\n\t\t\t\t\t\t\t\t\tmethod: $opts.method,\n\t\t\t\t\t\t\t\t\toutsideSpa: $opts.outsideSpa,\n\t\t\t\t\t\t\t\t\tparams: $opts.params,\n\t\t\t\t\t\t\t\t\tresponseType: $opts.responseType,\n\t\t\t\t\t\t\t\t\turl: $opts.url,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(_has($opts, 'body')){\n\t\t\t\t\t\t\t\t\tclonedOpts['body'] = $opts.body;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(_has($opts, 'contentType')){\n\t\t\t\t\t\t\t\t\tclonedOpts['contentType'] = $opts.contentType;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tmakeTheApiCall(clonedOpts).then((responseData)=>{\n\t\t\t\t\t\t\t\t\t// second call success, resolve back to the original makeApiCall call\n\t\t\t\t\t\t\t\t\tresolve(responseData);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}).catch(()=>{\n\t\t\t\t\t\t\t\t\t// getting a new token didn't fix the problem, have the user log out\n\t\t\t\t\t\t\t\t\tif(config.platformId === config.enums.Platform.ADD_IN){\n\t\t\t\t\t\t\t\t\t\t// automatically\n\t\t\t\t\t\t\t\t\t\tstore.commit('api/SET_TOKEN', '');\n\t\t\t\t\t\t\t\t\t\tstore.commit('USER_EMAIL', '');\n\t\t\t\t\t\t\t\t\t\twindow.location = '/Account/LogOff'\n\t\t\t\t\t\t\t\t\t\treturn reject();\n\n\t\t\t\t\t\t\t\t\t} else if(config.platformId === config.enums.Platform.ONLINE){\n\t\t\t\t\t\t\t\t\t\t// with an alert\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tSwal.fire({\n\t\t\t\t\t\t\t\t\t\t\tbuttonsStyling: false,\n\t\t\t\t\t\t\t\t\t\t\ttext: 'Token has expired.',\n\t\t\t\t\t\t\t\t\t\t\ticon: 'error',\n\t\t\t\t\t\t\t\t\t\t\tconfirmButtonText: 'Log Out',\n\t\t\t\t\t\t\t\t\t\t\tshowCloseButton: false,\n\t\t\t\t\t\t\t\t\t\t\tshowConfirmButton: true,\n\t\t\t\t\t\t\t\t\t\t\tcustomClass:{\n\t\t\t\t\t\t\t\t\t\t\t\tconfirmButton: 'btn btn-danger',\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t}).then((result) => {\n\t\t\t\t\t\t\t\t\t\t\tif (result.value) {\n\t\t\t\t\t\t\t\t\t\t\t\tstore.commit('api/SET_TOKEN', '');\n\t\t\t\t\t\t\t\t\t\t\t\tstore.commit('USER_EMAIL', '');\n\t\t\t\t\t\t\t\t\t\t\t\twindow.location = '/Account/LogOff'\n\t\t\t\t\t\t\t\t\t\t\t\treturn reject();\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t}//e:else:online\n\n\t\t\t\t\t\t\t\t});//e:catch\n\n\t\t\t\t\t\t\t});//e:AS_CheckToken\n\n\t\t\t\t\t\t} else if(failReason === 'Bad Request'){\n\t\t\t\t\t\t\treturn reject();\n\n\t\t\t\t\t\t} else if(failReason === 'expired'){\n\t\t\t\t\t\t\t// account suscription expired\n\t\t\t\t\t\t\trouter.push({\n\t\t\t\t\t\t\t\tname: 'Settings',\n\t\t\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\treturn reject();\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// many reasons it failed\n\t\t\t\t\t\t\tif(config.platformId === config.enums.Platform.ADD_IN){\n\t\t\t\t\t\t\t\t// general reject()\n\t\t\t\t\t\t\t\treturn reject(failReason);\n\n\t\t\t\t\t\t\t} else if(config.platformId === config.enums.Platform.ONLINE){\n\t\t\t\t\t\t\t\tif(!isRejectWithMessage){\n\t\t\t\t\t\t\t\t\tstore.commit('loaders/REMOVE_ID', 'App');\n\t\t\t\t\t\t\t\t\t// 2023.06.21 - commented this out, so it doesn't fire the Swal twice\n\t\t\t\t\t\t\t\t\t// if(failReason === 'Failed to fetch'){\n\t\t\t\t\t\t\t\t\t// \tfailReason = 'There was an error with this request. Please try again.'\n\t\t\t\t\t\t\t\t\t// }\n\n\t\t\t\t\t\t\t\t\t// Swal.fire({\n\t\t\t\t\t\t\t\t\t// \tbuttonsStyling: false,\n\t\t\t\t\t\t\t\t\t// \ttext: failReason,\n\t\t\t\t\t\t\t\t\t// \ticon: 'error',\n\t\t\t\t\t\t\t\t\t// \tconfirmButtonText: 'Ok',\n\t\t\t\t\t\t\t\t\t// \tshowCloseButton: false,\n\t\t\t\t\t\t\t\t\t// \tshowConfirmButton: true,\n\t\t\t\t\t\t\t\t\t// \tcustomClass:{\n\t\t\t\t\t\t\t\t\t// \t\tconfirmButton: 'btn btn-danger me-2',\n\t\t\t\t\t\t\t\t\t// \t},\n\t\t\t\t\t\t\t\t\t// });\n\t\t\t\t\t\t\t\t}//e:if:!isRejectWithMessage\n\n\t\t\t\t\t\t\t\treturn reject(failReason);\n\n\t\t\t\t\t\t\t}//e:else:online\n\n\t\t\t\t\t\t}//e:else:failReason\n\n\t\t\t\t\t});//e:makeTheApiCall.then\n\t\t\t\t});\n\n\t\t\t}//e:else:$opts.ignoreAuth\n\n\t\t} else {\n\t\t\t// no connection\n\t\t\tlet errorText = '';\n\n\t\t\tif(config.platformId === config.enums.Platform.ADD_IN){\n\t\t\t\terrorText = 'Your computer may have lost its connection to the internet. Please reconnect to the internet and try again.';\n\t\t\t\tstore.commit('loaders/REMOVE_ID', 'App');\n\n\t\t\t} else if(config.platformId === config.enums.Platform.ONLINE){\n\t\t\t\t// change error text based on route (am i in a paper or not)\n\t\t\t\t\n\t\t\t\tif(router.currentRoute.meta.module === config.enums.Module.PAPER_EDIT){\n\t\t\t\t\terrorText = 'Your computer may have lost its connection to the internet and we cannot save the latest changes to your paper. Please reconnect to the internet and try to save your paper again.';\n\t\t\t\t\tstore.dispatch('paperEdit/localVersion/checkIn');\n\t\t\t\t} else {\n\t\t\t\t\terrorText = 'Your computer may have lost its connection to the internet. Please reconnect to the internet and try again.';\n\t\t\t\t}\n\n\t\t\t\tSwal.fire({\n\t\t\t\t\tallowOutsideClick: false,\n\t\t\t\t\tbuttonsStyling: false,\n\t\t\t\t\ttitle: 'Internet connection failed',\n\t\t\t\t\ttext: errorText,\n\t\t\t\t\ticon: 'error',\n\t\t\t\t\tconfirmButtonText: 'OK',\n\t\t\t\t\tshowCloseButton: false,\n\t\t\t\t\tshowConfirmButton: true,\n\t\t\t\t\tcustomClass:{\n\t\t\t\t\t\tconfirmButton: 'btn btn-danger me-2',\n\t\t\t\t\t},\n\t\t\t\t}).then((result) => {\n\t\t\t\t\tif (result.value) {\n\t\t\t\t\t\tstore.commit('loaders/REMOVE_ID', 'App');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t}//e:else:online\n\n\t\t}//e:if:else:navigator.onLine\n\n\t});//e:Promise\n}\n","/*\n- AS_CheckToken\n-- checks the users token, if need be generate another one and return it\n-- 2023.05.29\n*/\nimport _isEmpty from 'lodash/isEmpty';\nimport config from '@/config';\nimport router from '@/router';\nimport store from '@/store';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport default () => {\n\treturn new Promise((resolve) => {\n\t\t// console.log('AS_CheckToken');\n\n\t\tlet passToken;\t// only used in PERRLA Online SPA\n\n\t\tif(config.platformId === config.enums.Platform.ONLINE){\n\t\t\tpassToken = localStorage.getItem(\"pc_PassToken\");\n\t\t}\n\n\t\tif (config.platformId === config.enums.Platform.ONLINE && passToken) {\n\t\t\t// PassToken Set - copy it and remove it\n\t\t\tstore.commit('api/SET_TOKEN', passToken);\n\t\t\tlocalStorage.removeItem(\"pc_PassToken\");\n\t\t\treturn resolve(passToken);\n\n\t\t} else {\n\t\t\t// PassToken not set or not in the ONLINE platform\n\t\t\t\n\t\t\t// check for New Relic GUID here\n\t\t\tif(store.state.api.sessionId === ''){\n\t\t\t\t// not set, generate one and save it\n\t\t\t\tlet newGUID = uuidv4().toUpperCase();\n\t\t\t\tstore.commit('api/SET_SESSION_ID', newGUID);\n\n\t\t\t\tif(window.newrelic){\n\t\t\t\t\tnewrelic.setCustomAttribute('SessionID', newGUID);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// already set\n\t\t\t\tstore.commit('api/SET_SESSION_ID', store.state.api.sessionId);\n\n\t\t\t\tif(window.newrelic){\n\t\t\t\t\tnewrelic.setCustomAttribute('SessionID', store.state.api.sessionId);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(config.platformId === config.enums.Platform.CHROME_EXT){\n\t\t\t\t// Chrome Ext Only\n\n\t\t\t\t// check if user is logged in\n\t\t\t\tchrome.storage.local.get('apiToken', (result) => {\n\t\t\t\t\tif(_isEmpty(result)){\n\t\t\t\t\t\t// no api token - go to log in \n\t\t\t\t\t\trouter.push({\n\t\t\t\t\t\t\tname: 'Login'\n\t\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t\t\treturn resolve();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// already set, just return what you have\n\t\t\t\t\t\treturn resolve(result.apiToken);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\t// AddIn and SPA\n\t\t\t\tif(store.state.api.token === ''){\n\t\t\t\t\t// Api Token is blank / hasn not been set\n\t\t\t\t\tif(config.platformId === config.enums.Platform.ADD_IN){\n\t\t\t\t\t\trouter.push({\n\t\t\t\t\t\t\tname: 'Login'\n\t\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t\t} else if(config.platformId === config.enums.Platform.ONLINE){\n\t\t\t\t\t\tif(config.isDev){\n\t\t\t\t\t\t\trouter.push({\n\t\t\t\t\t\t\t\tname: 'Login'\n\t\t\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// i have to use a hard redirect here to get from Public to App\n\t\t\t\t\t\t\twindow.location = config.appUrl + '/Public/#/login';\n\t\t\t\t\t\t} \n\t\t\t\t\t}\n\t\n\t\t\t\t} else {\n\t\t\t\t\t// Token already in vuex store, no problem\n\t\t\t\t\tstore.commit('api/SET_TOKEN', store.state.api.token);\n\t\t\t\t\treturn resolve(store.state.api.token);\n\t\n\t\t\t\t}//e:if:else:store.state.api.token\n\n\t\t\t}//e:if:else:platformId\n\n\t\t}//e:if:else:passToken\n\t\t\n\t});//e:Promise\n}","// AS_FullLogout\nimport store from '@/store';\n\nexport default () => {\n\treturn new Promise((resolve) => {\n\t\tstore.commit('loaders/ADD_ID', 'App');\n\n\t\t// Reset Store Items (which resets localStorage automatically)\n\t\tstore.commit('api/SET_TOKEN', '');\n\t\tstore.commit('idToken', '');\n\n\t\tstore.commit('SHOW_BETA_FEATURES', false);\n\n\t\tstore.commit('customer/SET_EMAIL', '');\n\t\tstore.commit('customer/SET_EXPIRATION_DATE', '');\n\t\tstore.commit('customer/SET_FIRST_NAME', '');\n\t\tstore.commit('customer/SET_ID', '0');\n\t\tstore.commit('customer/SET_INSTITUTION', '');\n\t\tstore.commit('customer/SET_LAST_NAME', '');\n\t\t\n\t\t// issue with support impersonating then logging out, but the system keeps previous user's references\n\t\tstore.commit('LAST_SYNC_DATE', '');\n\t\tstore.commit('REFERENCE_LIBRARY', []);\n\t\tstore.commit('refLibCompString', '');\n\t\tstore.commit('REFERENCE_LIBRARY_GENESIS', []);\n\t\tstore.commit('refLibCompStringGenesis', '');\n\n\t\tstore.commit('researchNotes/CLEAR_LIST');\n\n\t\tstore.commit('loaders/REMOVE_ID', 'App');\n\n\t\treturn resolve();\n\t});//e:Promise\n}","/*\n- AS_InitTooltips\n-- inits BS5 Tooltips\n-- the Add-In version can't use this yet since some cases have IE11 still, which doesn't work with Popper.js or Bootstrap 5\n*/\n\n// import Tooltip from 'bootstrap/js/dist/tooltip';\n\nexport default () => {\n\treturn new Promise((resolve) => {\n\t\t// console.log('AS_InitTooltips');\n\n\t\t// let the ui catch up so there will be a tooltip rendered\n\t\t// setTimeout(()=>{\n\t\t// \tconst tooltipTriggerList = document.querySelectorAll('[data-bs-toggle=\"tooltip\"]')\n\t\t// \tconst tooltipList = [...tooltipTriggerList].map((tooltipTriggerEl) => {\n\t\t// \t\tnew Tooltip(tooltipTriggerEl, {\n\t\t// \t\t\ttrigger : 'hover'\n\t\t// \t\t})\n\t\t// \t});\n\n\t\t\tresolve();\n\t\t// }, 500);\n\n\t});//e:Promise\n\n}","/*\n*****Advertisement*****\n \nDocumentation: TODO: Include a link to the Google Document for this type here\n\nType & Kind Questions\n- TODO: Document the type and kinds for thi type\n\nTODO: Document the parts and their fields here\nAuthorPart\n - TODO: Fields for this part here\n\nDatePart\n - TODO: Fields for this part here\n\nTitlePart\n - TODO: Fields for this part here\n\nSourcePart\n - TODO: Fields for this part here\n\n*/\n\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0 || kind.length == 0) {\n return 'Type and Kind required.';\n }\n\n switch (type) {\n case 'TYPE-NAME-HERE':\n break;\n }\n\n //TODO: Build our parts here to form our reference\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData) {\n //TODO; define our citation logic for this type here\n let firstCitation = '';\n let subsequentCitation = '';\n var hasSubsequent = false;\n\n let citation = {\n first: firstCitation,\n subsequent: subsequentCitation\n }\n\n return citation;\n}\n\n//TODO: Create private methods for each part","/*\n*****AncientClassicWork*****\n \nDocumentation: TODO: Include a link to the Google Document for this type here\nGOOGLE FORM: https://drive.google.com/open?id=1TJxlOLwx3NyKX9THrJWBzw5zEHwvh2ERmPx8yNT6_3A\nWEBFLOW FORM: http://magical-design-system.webflow.io/add-in/wizard/wizard-2-ancient-classic-work\n\n-There isn't a type/kind for Ancient & Classic Works\n[AuthorPart] [DatePart] [TitlePart] [SourcePart]\n\n-AuthorPart\n - Author, Editors w/out Authors\n- DatePart\n - Either a year or n.d.\n-TitlePart\n - Title of the work, Editors, Translators, Edition\n- SourcePart\n - Publishers, DOI/URL, Original Publication Date\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n \n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs){\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n\t_forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n authorString = refData.bookTitle.toTitleCase().italicize();\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n //if there ia publication date original also, include it before the publication date\n let publicationDateOriginal = shared.getYear(refData.originalPublicationDate);\n \n if (publicationDateOriginal.length == 0 && (refData.type == 'reprinted')) {\n publicationDateOriginal = 'n.d.';\n }\n\n if (publicationDateOriginal.length > 0) {\n year = publicationDateOriginal + '/'+ year;\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n // - Title of the work, Editors, Translators, Edition\n let titlePart = '';\n\n let title = shared.getStringValue(refData.bookTitle);\n \n if (title.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = title.italicize(); \n }\n \n //translated title\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (translatedTitle.length > 0) {\n titlePart = titlePart + ' [' + translatedTitle + ']';\n }\n\n //editors\n let editorArray = shared.getEditors(refData.contributors);\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n\n //translators\n let translatorString = shared.getTranslatorString(refData.contributors);\n\n //editor and translator string\n //this is only the scenario where they all match and we don't need the individual string\n let editorTranslatorString = shared.getEditorTranslatorString(refData.contributors);\n\n if (editorTranslatorString.length >0) {\n editorString = '';\n translatorString = '';\n }\n\n //edition\n let edition = shared.getStringValue(refData.edition);\n\n let authorArray = shared.getAuthors(refData.contributors);\n\n //build our secondary contributors portion\n if ((editorString.length > 0 && authorArray.length > 0) ||\n translatorString.length > 0 ||\n editorTranslatorString.length > 0||\n edition.length > 0) {\n \n var isFirstNames = true;\n\n titlePart = titlePart + ' (';\n\n if (editorTranslatorString.length > 0) {\n titlePart = titlePart + editorTranslatorString;\n isFirstNames = false;\n }\n\n if (editorString.length > 0 && authorArray.length > 0) {\n titlePart = titlePart + editorString;\n isFirstNames = false;\n }\n\n if (translatorString.length > 0) {\n if (isFirstNames) {\n titlePart = titlePart + translatorString; \n }\n else{\n titlePart = titlePart + '; ' + translatorString; \n }\n isFirstNames = false;\n }\n\n if ((edition.length > 0) && !isFirstNames) {\n titlePart = titlePart + ';';\n }\n\n if (edition.length > 0) {\n if (!isFirstNames) {\n titlePart = titlePart + ' ';\n isFirstNames = false;\n }\n\n edition = shared.fixEditionString(edition);\n\n titlePart = titlePart + edition;\n }\n\n titlePart = titlePart + ')';\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors, unless this is an entry\n if (editorArray.length > 0 && refData.type != 'entry') {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData) {\n\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n //Publishers, DOI/URL, Original Publication Date\n let sourcePart = '';\n let publisherString = shared.getPublisherString(refData.publishers);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n sourcePart = publisherString; \n } \n }\n\n //url\n let url = shared.getStringValue(refData.url);\n\n //doi\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n doi = shared.appendDOIURL(doi);\n\n sourcePart = sourcePart + doi;\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n //publication Date Original\n let publicationDateOriginal = shared.getStringValue(refData.originalPublicationDate);\n\n if (publicationDateOriginal.length > 0) {\n sourcePart = sourcePart + ' (Original work published ' + publicationDateOriginal + ')';\n }\n\n return sourcePart;\n}","const _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\n//Notes from breakdown with Graysen\n/*\nType Question\nKind Question\n\n-Type: Anthology (anthology)\n - Kind: (whole) All or part of an anthology\n - Kind: (foreign) A foreign or translated anthology\n - Kind: (republished) A republished anthology\n [Whole Author Part] [Date Part] [Title Part] [Source Part]\n\n- Type: Entry in an Anthology (entry)\n - Kind: (entry) An entry in an anthology\n - Kind: (foreign) An entry in a foreign or translated anthology \n [Author Part] [Date Part] [Title Part] [Entry Source Part]\n\n- Whole Author Part\n - Editors\n- AuthorPart\n - Authors, Group Authors, Editors\n- DatePart\n - Publication year\n- TitlePart\n - Title of Book, Translated Title, Editors, Translators, Edition\n- SourcePart\n - Publishers, DOI/URL, Original Publication Date\n- Entry Source Part\n - \"In \", Editors, Book Title, Page Numbers, Publishers, DOI/URL, Original Publication Date\n\n*/\n\n\nfunction getReference (refData){\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n let refAuthorPart = '';\n\n if (type.length == 0 || kind.length == 0) {\n return 'Type and Kind required.';\n }\n\n let referenceValue = '';\n let datePart = getDatePart(refData);\n \n switch (type) {\n case 'anthology':\n // [Whole Author Part] [Date Part] [Title Part] [Source Part]\n let wholeAuthorPart = getWholeAuthorPart(refData);\n let sourcePart = getSourcePart(refData);\n let titlePart = getTitlePart(refData);\n\n refAuthorPart = wholeAuthorPart;\n \n if (wholeAuthorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = wholeAuthorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n break;\n case 'entry':\n // [Author Part] [Date Part] [Entry Title Part] [Entry Source Part]\n let authorPart = getAuthorPart(refData);\n let entrySourcePart = getEntrySourcePart(refData);\n let entryTitlePart = getEntryTitlePart(refData);\n\n refAuthorPart = authorPart;\n\n if (authorPart.length == 0) {\n\n entryTitlePart = shared.fixTitlePartClosure(entryTitlePart);\n\n //no contributors\n referenceValue = entryTitlePart + ' ' + datePart + ' ' + entrySourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + entryTitlePart + ' ' + entrySourcePart;\n }\n\n break;\n }\n\n let reference = {\n value : referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: refAuthorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs){\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n if (refData.type == 'entry') {\n authorString = '\"' + refData.entryTitle.toTitleCase() + ',\" ';\n }\n else{\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n authorString = refData.anthologyTitle.toTitleCase().italicize();\n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n //if there ia publication date original also, include it before the publication date\n let publicationDateOriginal = shared.getYear(refData.originalPublicationDate);\n \n if (publicationDateOriginal.length == 0 && (refData.type == 'reprinted')) {\n publicationDateOriginal = 'n.d.';\n }\n\n if (publicationDateOriginal.length > 0) {\n year = publicationDateOriginal + '/'+ year;\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getDatePart(refData) {\n\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getEntryTitlePart(refData){\n //Entry title [Translated entry title] (A. A. Translatora, Trans.).\n let entryTitle = shared.getStringValue(refData.entryTitle);\n let translatedEntryTitle = shared.getStringValue(refData.translatedEntryTitle);\n let translatorString = shared.getTranslatorString(refData.contributors);\n\n let titlePart = entryTitle;\n\n if (translatedEntryTitle.length > 0) {\n titlePart = titlePart + ' [' + translatedEntryTitle + ']';\n }\n\n if (translatorString.length > 0) {\n titlePart = titlePart + ' (' + translatorString + ').';\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getEntrySourcePart(refData){\n //In A. A. Editora (Ed.), Anthology title [Translated anthology title] (2nd ed., pp. 7–13). Publisher 1. https://doi.org.10.123456789 (Original work published 1945)\"\n let entrySourcePart = 'In';\n\n let title = shared.getStringValue(refData.anthologyTitle);\n let translatedTitle = shared.getStringValue(refData.translatedAnthologyTitle);\n let edition = shared.getStringValue(refData.edition);\n let pageNumbers = shared.getStringValue(refData.pageNumbers);\n let normalSourcePart = getSourcePart(refData);\n\n //editors\n let editorArray = shared.getEditors(refData.contributors);\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ' (Ed.)';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ' (Eds.)';\n }\n }\n\n if (editorString.length > 0) {\n entrySourcePart = entrySourcePart + ' ' + editorString + ',';\n }\n\n if (title.length > 0) {\n entrySourcePart = entrySourcePart + ' ' + title.italicize();\n }\n\n if (translatedTitle.length > 0) {\n entrySourcePart = entrySourcePart + ' [' + translatedTitle + ']';\n }\n\n if (edition.length > 0 || pageNumbers.length > 0) {\n entrySourcePart = entrySourcePart + ' (';\n\n if (edition.length > 0) {\n\n edition = shared.fixEditionString(edition);\n\n entrySourcePart = entrySourcePart + edition;\n }\n\n if (edition.length > 0 && pageNumbers.length > 0) {\n entrySourcePart = entrySourcePart + ', '; \n }\n\n if (pageNumbers.length > 0) {\n let pageNumbersFormatted = shared.formatPageNumbers(pageNumbers);\n\n entrySourcePart = entrySourcePart + pageNumbersFormatted;\n }\n \n entrySourcePart = entrySourcePart + ')'\n }\n\n entrySourcePart = entrySourcePart + '.'\n\n //append our normal source part on here\n entrySourcePart = entrySourcePart + ' ' + normalSourcePart;\n\n return entrySourcePart;\n}\n\nfunction getTitlePart(refData){\n // - Title of Book, Translated Title, Editors, Translators, Edition\n let titlePart = '';\n\n let title = shared.getStringValue(refData.anthologyTitle);\n \n if (title.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = title.italicize(); \n }\n \n //translated title\n let translatedTitle = shared.getStringValue(refData.translatedAnthologyTitle);\n\n if (translatedTitle.length > 0) {\n titlePart = titlePart + ' [' + translatedTitle + ']';\n }\n\n //editors\n let editorArray = shared.getEditors(refData.contributors);\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n\n //translators\n let translatorString = shared.getTranslatorString(refData.contributors);\n\n //editor and translator string\n //this is only the scenario where they all match and we don't need the individual string\n let editorTranslatorString = shared.getEditorTranslatorString(refData.contributors);\n\n if (editorTranslatorString.length >0) {\n editorString = '';\n translatorString = '';\n }\n\n //edition\n let edition = shared.getStringValue(refData.edition);\n\n let authorArray = shared.getAuthors(refData.contributors);\n\n //build our secondary contributors portion\n if ((editorString.length > 0 && authorArray.length > 0) ||\n translatorString.length > 0 ||\n editorTranslatorString.length > 0||\n edition.length > 0) {\n \n var isFirstNames = true;\n\n titlePart = titlePart + ' (';\n\n if (editorTranslatorString.length > 0) {\n titlePart = titlePart + editorTranslatorString;\n isFirstNames = false;\n }\n\n if (editorString.length > 0 && authorArray.length > 0) {\n titlePart = titlePart + editorString;\n isFirstNames = false;\n }\n\n if (translatorString.length > 0) {\n if (isFirstNames) {\n titlePart = titlePart + translatorString; \n }\n else{\n titlePart = titlePart + '; ' + translatorString; \n }\n isFirstNames = false;\n }\n\n if ((edition.length > 0) && !isFirstNames) {\n titlePart = titlePart + ';';\n }\n\n if (edition.length > 0) {\n if (!isFirstNames) {\n titlePart = titlePart + ' ';\n isFirstNames = false;\n }\n\n edition = shared.fixEditionString(edition);\n\n titlePart = titlePart + edition;\n }\n\n titlePart = titlePart + ')';\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors, unless this is an entry\n if (editorArray.length > 0 && refData.type != 'entry') {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n return authorPart;\n}\n\nfunction getWholeAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors\n if (editorArray.length > 0) {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n return authorPart;\n}\n\nfunction getSourcePart(refData){\n //Publishers, DOI/URL, Original Publication Date\n let sourcePart = '';\n let publisherString = shared.getPublisherString(refData.publishers);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n sourcePart = publisherString; \n } \n }\n\n //url\n let url = shared.getStringValue(refData.url);\n\n //doi\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n doi = shared.appendDOIURL(doi);\n\n sourcePart = sourcePart + doi;\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n //publication Date Original\n let publicationDateOriginal = shared.getStringValue(refData.originalPublicationDate);\n\n if (publicationDateOriginal.length > 0) {\n sourcePart = sourcePart + ' (Original work published ' + publicationDateOriginal + ')';\n }\n\n return sourcePart;\n}\n","/*\n*****Apparatus*****\n \nFORM: https://docs.google.com/spreadsheets/d/1_IuQwfTSRuBqUB4N2LQDl3BqT4knVgq97A_PaTEQAZ8/edit#gid=1084144617\nMOCKUP: https://magical-design-system.webflow.io/add-in/wizard/wizard-2-apparatus-equipment\n\nTYPES & KINDS:\n apparatus\n - This is for an apparatus or piece of equipment. \n [contributors]. ([publicationDate]). [title] ([model]) [Apparatus]. [url]\n combo\n - This is for an apparatus or piece of equipment that also includes software with it under the same name. \n [contributors]. ([publicationDate]). [title] ([model]) [Apparatus and software]. [url]\n\nAuthorPart\n contributor.groupAuthor\n - The company responsible for the apparatus, equipment, & software.\n\nDatePart\n publicationDate\n - The year the apparatus was published or created.\n - Follows YYYY\n\nTitlePart\n title\n - The name of the apparatus & software\n model\n - The model number for the apparatus or equipment. Only included if not already in the title.\n - Placed in parentheses after the title.\n\nSourcePart\n url\n - A url for the webpage for the apparatus or equipment.\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n \n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n let type = shared.getStringValue(refData.type);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n \n let editorArray = shared.getEditors(refData.contributors);\n \n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.title);\n \n if (title.length > 0) {\n authorString = title;\n }\n }\n }\n \n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n else{\n year = shared.fixPageDash(year);\n }\n \n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n \n return citation;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0) {\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n let type = shared.getStringValue(refData.type);\n\n let title = shared.getStringValue(refData.title);\n let model = shared.getStringValue(refData.model);\n\n if (title.length > 0) {\n titlePart = title.italicize();\n }\n\n if (model.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '(' + model + ')';\n }\n\n let label = '';\n\n switch (type) {\n case 'apparatus':\n label = '[Apparatus]';\n break;\n case 'combo':\n label = '[Apparatus and software]';\n break;\n }\n\n if (label.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + label;\n }\n\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart);\n }\n\n return titlePart;\n}\n\nfunction getSourcePart(refData){\n let sourcePart = '';\n let url = shared.getStringValue(refData.url);\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}","/*\n*****Artwork*****\n \nDocumentation:\n\nType & Kind Questions\n- \"museum\" : Art found in a museum or collection\n- \"outside\" : Art viewed outside a museuem\n\nAuthorPart\n - Artist Name (Author), Group Artist Name (Group Author)\n\nDatePart\n - Year the work was produced (e.g., 1915–1918)\n\nTitlePart\n - Title of the work in italics, format/medium of the work (e.g., Oil painting)\n\nSourcePart\n - Museum/Collection name (uses Publisher), Publisher/Venue Name (uses Publisher), City, State, Country, URL\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n \n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.title);\n title = shared.stripSubtitle(title);\n\n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n authorString = title.toTitleCase().italicize(); \n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n else{\n year = shared.fixPageDash(year);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n let format = shared.getStringValue(refData.format);\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n titlePart = title; \n }\n else{\n titlePart = title.italicize(); \n }\n }\n\n if (format.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[' + format.upperFirstLetter() + ']'; \n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors, unless this is an entry\n if (editorArray.length > 0 && refData.type != 'entry') {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n if (authorPart.length == 0) {\n //use our title instead\n let title = shared.getStringValue(refData.entryTitle);\n\n if (title.length > 0) {\n\n if (!title.endsWith('.')) {\n title = title + '.';\n }\n \n authorPart = title; \n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + shared.fixPageDash(formattedDate) + ').';\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n // Museum Name, Washington, D.C., United States.\n let sourcePart = '';\n\n let publisherString = shared.getPublisherString(refData.publishers);\n let city = shared.getStringValue(refData.city);\n let state = shared.getStringValue(refData.state);\n let country = shared.getStringValue(refData.country);\n let url = shared.getStringValue(refData.url);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n //remove our period for this one....we'll add it back later if needed\n sourcePart = publisherString.substring(0, publisherString.length -1); \n } \n }\n\n if (city.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', '\n }\n\n sourcePart = sourcePart + city;\n }\n\n if (state.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', '\n }\n\n sourcePart = sourcePart + state;\n }\n\n if (country.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', '\n }\n\n sourcePart = sourcePart + country;\n }\n\n if (sourcePart.length > 0) {\n if (!sourcePart.endsWith('.')) {\n sourcePart = sourcePart + '.';\n }\n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' '\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}","/*\n*****BillsResolutions*****\n \nDocumentation: https://docs.google.com/spreadsheets/d/16R6dnWoehlWQXXDOq4QLM8YNp_lqvYm2qtCRj2Vh8tM/edit#gid=2071428744\nMockup: http://magical-design-system.webflow.io/add-in/wizard/wizard-2-bills-resolutions\n\nType & Kind Questions\n- Types: \n enactedFed\n - this is for enacted federal bills & resolutions\n unenactedFed\n - this is for unenacted federal bills & resolutions\n- Kinds:\n senate\n - this is for enactedFed & unenactedFed.\n house\n - this is for enactedFed & unenactedFed types.\nPARTS\n - title: the title of an unenacted bill\n - shortTitle: an optional shortened title to be used for the citation\n - billNumber: the number of the bill\n - volume: the volume of the Congressional Record\n - pageNumber: the starting page number for the record\n - session: the session of congress when it came up. The user is prompted to input the ordinal number for the session. If the session doesn't end with a letter (-th, -st, -rd), then we should add it for them.\n - publicationDate: the year the bill/resolution was acted on\n - url: url for the bill/resolution\n\nenactedFed senate\n - S. Res. [billNumber], [session] Cong., [volume] Cong. Rec. [pageNumber] ([publicationDate]) (enacted). [url]\n\nenactedFed house\n - H.R. Res. [billNumber], [session] Cong., [volume] Cong. Rec. [pageNumber] ([publicationDate]) (enacted). [url]\n\nuneancted senate\n - [title], S. [billNumber], [session] Cong. ([publicationDate]). [url]\n\nunenacted house\n - [title], H.R. [billNumber], [session] Cong. ([publicationDate]). [url]\n\n*/\n\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n //legal types are their own beasts.....we won't break them into pieces\n let referenceValue = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0 || kind.length == 0) {\n return 'Type and Kind required.';\n }\n\n switch (type) {\n case 'enactedFed':\n\n if (kind == 'senate' || kind == 'senateJoint') {\n referenceValue = getEnactedSenate(refData);\n }\n\n if (kind == 'house' || kind == 'houseJoint') {\n referenceValue = getEnactedHouse(refData);\n }\n \n break;\n case 'unenactedFed':\n\n if (kind == 'senate') {\n referenceValue = getUnenactedSenate(refData);\n }\n\n if (kind == 'house') {\n referenceValue = getUnenactedHouse(refData);\n }\n\n break;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: '',\n datePart: ''\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData) {\n \n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n let authorString = '';\n\n let title = shared.getStringValue(refData.title);\n let shortTitle = shared.getStringValue(refData.shortTitle);\n let year = shared.getYear(refData.publicationDate);\n\n if (type == 'enactedFed') {\n title = '';\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n if (shortTitle.length > 0) {\n title = shortTitle;\n }\n\n if (title.length > 0) {\n authorString = title;\n }\n else{\n let billNumber = shared.getStringValue(refData.billNumber);\n\n switch (type) {\n case 'enactedFed':\n \n if (kind == 'senate' || kind == 'senateJoint') {\n authorString = 'S. Resolution';\n\n if (billNumber.length > 0) {\n authorString = authorString + ' ' + billNumber;\n }\n }\n \n if (kind == 'house' || kind == 'houseJoint') {\n authorString = 'H.R. Resolution';\n\n if (billNumber.length > 0) {\n authorString = authorString + ' ' + billNumber;\n }\n }\n \n break;\n case 'unenactedFed':\n \n if (kind == 'senate') {\n authorString = 'S.';\n\n if (billNumber.length > 0) {\n authorString = authorString + ' ' + billNumber;\n }\n }\n \n if (kind == 'house') {\n authorString = 'H.R.';\n\n if (billNumber.length > 0) {\n authorString = authorString + ' ' + billNumber;\n }\n }\n \n break;\n }\n\n }\n\n let citation = shared.getCitations(citationData, authorString, year, []);\n\n return citation;\n}\n\nfunction getEnactedSenate(refData){\n //- S. Res. [billNumber], [session] Cong., [volume] Cong. Rec. [pageNumber] ([publicationDate]) (enacted). [url]\n //S. Res. 123, 100th Cong., 456 Cong. Rec. 789 (2018) (enacted). https://www.perrla.com/resolution\n let value = '';\n let billNumber = shared.getStringValue(refData.billNumber);\n let session = shared.getStringValue(refData.session);\n let volume = shared.getStringValue(refData.volume);\n let pageNumber = shared.getStringValue(refData.pageNumber);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let url = shared.getStringValue(refData.url);\n\n let label = 'S. Res.';\n\n if (refData.kind == 'senateJoint') {\n label = 'S.J. Res.';\n }\n\n if (billNumber.length > 0) {\n if (value.length > 0) {\n value = value + ', ';\n }\n\n value = value + label + ' ' + billNumber;\n }\n \n if (session.length > 0) {\n if (value.length > 0) {\n value = value + ',';\n }\n\n session = shared.getOrdinalValue(session);\n\n value = value + ' ' + session;\n value = value + ' Cong.'\n }\n\n if (volume.length > 0) {\n if (value.length > 0) {\n value = value + ',';\n }\n value = value + ' ' + volume;\n }\n\n if (pageNumber.length > 0) {\n if (value.length > 0) {\n value = value + ' ';\n }\n\n value = value + 'Cong. Rec. ' + pageNumber;\n }\n\n if (value.length > 0) {\n value = value + ' ';\n }\n\n if (publicationDate.length > 0) {\n publicationDate = shared.getYear(publicationDate);\n value = value + '(' + publicationDate + ')';\n }\n else{\n value = value + '(n.d.)';\n }\n\n if (value.length > 0) {\n value = value + ' ';\n }\n\n value = value + '(enacted).'\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n value = value + ' ' + url;\n }\n\n return value;\n}\n\nfunction getUnenactedSenate(refData){\n // Title of the Resolution Act, S. 123, 100th Cong. (2018). https://www.perrla.com/resolution\n // - [title], S. [billNumber], [session] Cong. ([publicationDate]). [url]\n let value = '';\n let title = shared.getStringValue(refData.title);\n let billNumber = shared.getStringValue(refData.billNumber);\n let session = shared.getStringValue(refData.session);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let url = shared.getStringValue(refData.url);\n\n if (title.length > 0) {\n value = title;\n }\n\n if (billNumber.length > 0) {\n if (value.length > 0) {\n value = value + ', ';\n }\n\n value = value + 'S. ' + billNumber;\n }\n\n if (session.length > 0) {\n if (value.length > 0) {\n value = value + ',';\n }\n\n session = shared.getOrdinalValue(session);\n\n value = value + ' ' + session;\n value = value + ' Cong.'\n }else{\n if (value.length > 0) {\n value = value + '.';\n } \n }\n\n if (value.length > 0) {\n value = value + ' ';\n }\n\n if (publicationDate.length > 0) {\n publicationDate = shared.getYear(publicationDate);\n value = value + '(' + publicationDate + ').';\n }\n else{\n value = value + '(n.d.).';\n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n value = value + ' ' + url;\n }\n\n return value;\n}\n\nfunction getEnactedHouse(refData){\n //- H.R. Res. [billNumber], [session] Cong., [volume] Cong. Rec. [pageNumber] ([publicationDate]) (enacted). [url]\n //H.R. Res. 123, 100th Cong., 456 Cong. Rec. 789 (2018) (enacted). https://www.perrla.com/resolution\"\n let value = '';\n let billNumber = shared.getStringValue(refData.billNumber);\n let session = shared.getStringValue(refData.session);\n let volume = shared.getStringValue(refData.volume);\n let pageNumber = shared.getStringValue(refData.pageNumber);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let url = shared.getStringValue(refData.url);\n\n let label = 'H.R. Res.';\n\n if (refData.kind == 'houseJoint') {\n label = 'H.R.J. Res.';\n }\n\n if (billNumber.length > 0) {\n if (value.length > 0) {\n value = value + ', ';\n }\n\n value = value + label + ' ' + billNumber;\n }\n \n if (session.length > 0) {\n if (value.length > 0) {\n value = value + ',';\n }\n\n session = shared.getOrdinalValue(session);\n\n value = value + ' ' + session;\n value = value + ' Cong.'\n }\n\n if (volume.length > 0) {\n if (value.length > 0) {\n value = value + ',';\n }\n value = value + ' ' + volume;\n }\n\n if (pageNumber.length > 0) {\n if (value.length > 0) {\n value = value + ' ';\n }\n\n value = value + 'Cong. Rec. ' + pageNumber;\n }\n\n if (value.length > 0) {\n value = value + ' ';\n }\n\n if (publicationDate.length > 0) {\n publicationDate = shared.getYear(publicationDate);\n value = value + '(' + publicationDate + ')';\n }\n else{\n value = value + '(n.d.)';\n }\n\n if (value.length > 0) {\n value = value + ' ';\n }\n\n value = value + '(enacted).'\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n value = value + ' ' + url;\n }\n\n return value;\n}\n\nfunction getUnenactedHouse(refData){\n //- [title], H.R. [billNumber], [session] Cong. ([publicationDate]). [url]\n //Title of the Resolution Act Which is Really Long, H.R. 123, 100th Cong. (2018). https://www.perrla.com/resolution\n let value = '';\n let title = shared.getStringValue(refData.title);\n let billNumber = shared.getStringValue(refData.billNumber);\n let session = shared.getStringValue(refData.session);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let url = shared.getStringValue(refData.url);\n\n if (title.length > 0) {\n value = title;\n }\n\n if (billNumber.length > 0) {\n if (value.length > 0) {\n value = value + ', ';\n }\n\n value = value + 'H.R. ' + billNumber;\n }\n \n if (session.length > 0) {\n if (value.length > 0) {\n value = value + ',';\n }\n\n session = shared.getOrdinalValue(session);\n\n value = value + ' ' + session;\n value = value + ' Cong.'\n }else{\n if (value.length > 0) {\n value = value + '.';\n } \n }\n\n if (value.length > 0) {\n value = value + ' ';\n }\n\n if (publicationDate.length > 0) {\n publicationDate = shared.getYear(publicationDate);\n value = value + '(' + publicationDate + ').';\n }\n else{\n value = value + '(n.d.).';\n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n value = value + ' ' + url;\n }\n\n return value;\n}","/*\n*****BLOG*****\n\nThere is no type/kind question for blogs.\n\n[Author Part] [Date Part] [Title Part] [Source Part]\n\nAuthor Part\n - Author, Username, Group Author\n - inverted names\n\nDate Part\n - As specific a date as available: YYYY, MM DD\n - No date = n.d.\n\nTitle Part\n - Entry title or description, Blog title\n\nSource Part\n - Retrieval Date\n - URL\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n \n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n // if (authorPart.length == 0) {\n // //no contributors\n // referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n // }\n // else{\n // referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(datePart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(sourcePart);\n // }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let entryTitle = shared.getStringValue(refData.entryTitle);\n\n authorString = '\"' + entryTitle.toTitleCase() + ',\" ';\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0 && refData.type == 'entry') {\n year = 'n.d.';\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n //- Entry title or description, Blog title\n //Blog entry title. Blog Name.\n let titlePart = '';\n\n let title = shared.getStringValue(refData.entryTitle);\n let blogTitle = shared.getStringValue(refData.blogTitle);\n let authorArray = shared.getAuthors(refData.contributors);\n \n //entry title has aleady been used if there aren't any authors\n if (title.length > 0 && authorArray.length != 0) {\n\n if (!title.endsWith('.') && !title.endsWith('?')) {\n title = title + '.';\n }\n\n titlePart = title; \n }\n\n if (blogTitle.length > 0) {\n\n //if the blog title matches our author part (group author name), then don't add it\n if (authorArray.length > 0) {\n let authorPart = getAuthorPart(refData);\n\n if (blogTitle + '.' != authorPart) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n \n titlePart = titlePart + blogTitle.italicize();\n }\n\n if (refData.type == 'blog') {\n titlePart = titlePart.appendData('[Blog series]');\n }\n }\n else{\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n \n titlePart = titlePart + blogTitle.italicize();\n\n if (refData.type == 'blog') {\n titlePart = titlePart.appendData('[Blog series]');\n }\n } \n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors, unless this is an entry\n if (editorArray.length > 0 && refData.type != 'entry') {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n if (authorPart.length == 0) {\n //use our title instead\n let title = shared.getStringValue(refData.entryTitle);\n\n if (title.length > 0) {\n\n if (!title.endsWith('.')) {\n title = title + '.';\n }\n \n authorPart = title; \n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n\n if(refData.type == 'entry'){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n }\n else{\n return '';\n }\n}\n\nfunction getSourcePart(refData){\n // - Retrieval Date\n // - URL\n let sourcePart = '';\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n let url = shared.getStringValue(refData.url);\n\n if (retrievalDate.length > 0) {\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + 'Retrieved';\n sourcePart = sourcePart + ' ' + shared.formatRetrievalDate(retrievalDate);\n sourcePart = sourcePart + ', from';\n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}","const _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation,\n getAuthorPart,\n getDatePart\n}\n\n//Notes from breakdown with Graysen\n/*\nType Question\nKind Quesstion\n\n-Type: (book) Book, EBook, Audiobook\n - Kind: (whole) All or Part\n - Kind: (translated) Foreign or Translated\n - Kind: (republished) Republished\n - Kind: (multivolume) Volume in Series\n[AuthorPart][DatePart][TitlePart][SourcePart]\n\n\n- Type: Chapter in Edited Book\n - Kind: All or Part Chapter\n - Kind: Foreign or Translated Chapter \n - Kind: Republished chapter from a book\n - Kind: Chapter from a volume in a series\n[ChapterAuthorPart][DatePart][ChapterTitlePart][ChapterSourcePart [BookEditorPart][BookTitlePart][BookSourcePart][OriginalBookSourcePart]]]\n[ChapterTitlePart][DatePart][ChapterSourcePart [BookEditorPart][BookTitlePart][BookSourcePart][OriginalBookSourcePart]] - (APA Example 10.44)\n - Kind: Republished from journal\n[ChapterAuthorPart][DatePart][ChapterTitlePart][ChapterJournalSourcePart [BookEditorPart][BookTitlePart][BookSourcePart][OriginalJournalSourcePart]] - (APA Example 10.43)\n\n- AuthorPart\n - Authors, Group Authors, Editors\n - This is done: Book.getAuthorPart\n- DatePart\n - Either a year, year-month-day, nd, specific for kind or type\n - This is done: Book.getDatePart\n- TitlePart\n - Title of Book (SeriesTitle, VolumeTitle, Volume), Translated Title, Editors, Translators, Narrators, Edition, (Volume) Format\n - This is done: Book.getTitlePart\n- SourcePart\n - Publishers, DOI/URL, Original Publication Date\n - This is done: Book.getSourcePart\n- ChapterAuthorPart\n - ChapterAuthors, ChapterGroupAuthors\n - If there is nothing, re-order with title ahead of date\n - This is done: Book.getChapterAuthorPart\n- ChapterTitlePart\n - ChapterTitle, TranslatedChapterTitle, Translators\n - This is done: Book.getChapterTitlePart \n\n\n- ChapterSourcePart\n - \"In \"\n - BookEditorPart\n - Editors + \" Eds.\"\n - BookTitlePart\n - Title of Book, Translated Book Title, Narrators, edition, volume, page numbers, format\n - BookSourcePart\n - Publishers, DOI/URL\n - OriginalBookSourcePart\n - \"Reprinted from \"\n - Original Title, Original Pages, Original Contributors, Original Publication Date, Original Publishers\n\n- ChapterJournalSourcePart\n - \"In \"\n - Same BookEditorPart\n - Same BookTitlePart\n - Same BookSourcePart\n - OriginalJournalSourcePart\n - \"Reprinted from \"\n - Original Article Title, Original Publication Date, Original Journal Title, Original Volume Issue Number, Original Pages, Original DOI URL\n*/\n\n\nfunction getReference (refData){\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n let refAuthorPart = '';\n let refDatePart = '';\n\n if (type.length == 0 || kind.length == 0) {\n return 'Type and Kind required.';\n }\n\n let referenceValue = '';\n let datePart = getDatePart(refData);\n refDatePart = datePart;\n\n switch (type) {\n case 'book':\n case 'series':\n //[AuthorPart][DatePart][TitlePart][SourcePart]\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let sourcePart = getSourcePart(refData);\n\n refAuthorPart = authorPart;\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n break;\n case 'bookChapter':\n \n let chapterAuthorPart = getChapterAuthorPart(refData);\n let chapterTitlePart = getChapterTitlePart(refData);\n\n refAuthorPart = chapterAuthorPart;\n\n // [ChapterAuthorPart][DatePart][ChapterTitlePart][ChapterSourcePart [BookEditorPart][BookTitlePart][BookSourcePart][OriginalBookSourcePart]]]\n // [ChapterTitlePart][DatePart][ChapterSourcePart [BookEditorPart][BookTitlePart][BookSourcePart][OriginalBookSourcePart]] - (APA Example 10.44)\n if (kind == 'whole' || kind == 'translated' || kind == 'multivolume' || kind == 'book') {\n let chapterSourcePart = getChapterSourcePart(refData);\n\n if (chapterAuthorPart.length == 0) {\n //no contributors\n referenceValue = chapterTitlePart + ' ' + datePart + ' ' + chapterSourcePart; \n }\n else{\n referenceValue = chapterAuthorPart + ' ' + datePart + ' ' + chapterTitlePart + ' ' + chapterSourcePart;\n }\n }\n\n //[ChapterAuthorPart][DatePart][ChapterTitlePart][ChapterJournalSourcePart [BookEditorPart][BookTitlePart][BookSourcePart][OriginalJournalSourcePart]] - (APA Example 10.43)\n if (kind == 'journal') {\n let chapterJournalSourcePart = getChapterJournalSourcePart(refData);\n\n if (chapterAuthorPart.length == 0) {\n //no contributors\n referenceValue = chapterTitlePart + ' ' + datePart + ' ' + chapterJournalSourcePart; \n }\n else{\n referenceValue = chapterAuthorPart + ' ' + datePart + ' ' + chapterTitlePart + ' ' + chapterJournalSourcePart;\n }\n }\n\n break;\n }\n\n let reference = {\n value : referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: refAuthorPart,\n datePart: refDatePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs){\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n\t// i'm using lodash here since the chrome ext creates contributors as an object \n\t_forEach(refData.contributors, (item) => {\n \tif (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor') {\n authorArray.push(item);\n }\n\t});\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n\n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n //use chapter intead of book for book chapters\n if (refData.type == 'bookChapter') {\n authorString = '\"' + refData.chapterTitle.toTitleCase() + ',\" ';\n }\n else{\n\n if (refData.bookTitle.trim().length == 0) {\n authorString = '';\n }\n else\n {\n authorString = refData.bookTitle.trimSubtitle().toTitleCase().italicize();\n } \n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n //if there ia publication date original also, include it before the publication date\n let publicationDateOriginal = shared.getYear(refData.originalPublicationDate);\n \n if (publicationDateOriginal.length == 0 && (refData.kind == 'book' || refData.kind == 'journal' || refData.kind == 'republished')) {\n publicationDateOriginal = 'n.d.';\n }\n\n if (publicationDateOriginal.length > 0) {\n year = publicationDateOriginal + '/'+ year;\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors\n if (editorArray.length > 0) {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n return authorPart;\n}\n\nfunction getChapterAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n\n if (publicationDate.length == 0) {\n publicationDate = 'n.d.';\n }\n else{\n if (refData.publicationDate.includes(\"/\")) {\n var array = refData.publicationDate.split(\"/\");\n\n if (array.length > 2) {\n publicationDate = array[2]; \n }\n else {\n publicationDate = shared.getYear(publicationDate);\n }\n }\n else{\n publicationDate = refData.publicationDate;\n }\n }\n\n publicationDate = shared.fixPageDash(publicationDate);\n\n let datePart = '(' + publicationDate + ').';\n\n return datePart;\n}\n\nfunction getTitlePart(refData){\n let title = shared.getStringValue(refData.bookTitle);\n let titlePart = '';\n \n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n let volumeTitle = shared.getStringValue(refData.volumeTitle);\n let volume = shared.getStringValue(refData.volume);\n\n if (seriesTitle.length > 0 || volumeTitle.length > 0) {\n\n if (seriesTitle.length > 0) {\n title = seriesTitle;\n \n if (volume.length > 0) {\n \n if (volumeTitle.length > 0) {\n\n title = title + ': Vol. ' + volume;\n\n //clear the volume to be ignored later\n volume = '';\n\n title = title + '. ' + volumeTitle; \n }\n // else{\n // title = title + ' Vol. ' + volume;\n // }\n }\n else{\n if (volumeTitle.length > 0) {\n title = title + ': ' + volumeTitle;\n } \n }\n }\n else{\n title = volumeTitle; \n }\n }\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n titlePart = title; \n }\n else{\n titlePart = title.trimSubtitle().italicize();\n } \n }\n \n //translated title\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (translatedTitle.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[' + translatedTitle + ']';\n }\n\n //editors\n let editorArray = [];\n if (refData.kind == 'volume') {\n editorArray = getVolumeEditors(refData.contributors);\n }else{\n editorArray = shared.getEditors(refData.contributors);\n }\n\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n\n //translators\n let translatorString = shared.getTranslatorString(refData.contributors);\n\n //editor and translator string\n //this is only the scenario where they all match and we don't need the individual string\n let editorTranslatorString = shared.getEditorTranslatorString(refData.contributors);\n\n if (editorTranslatorString.length >0) {\n editorString = '';\n translatorString = '';\n }\n\n //illustrators\n let illustratorString = '';\n\n illustratorString = shared.getIllustratorString(refData.contributors);\n\n //narrators\n let narratorArray = [];\n\n if (typeof refData.contributors != 'undefined') {\n\t\t_forEach(refData.contributors, (item) => {\n\t\t\tif (item.type == 'narrator') {\n if(item.lastName.length > 0 ||\n item.firstName.length > 0 ||\n item.middleName.length > 0 ||\n item.suffix.length > 0){\n narratorArray.push(item);\n }\n }\n\t\t});\n }\n\n let narratorString = '';\n\n if (narratorArray.length > 0) {\n narratorString = shared.getReferenceNameString(narratorArray, true);\n\n if (narratorArray.length == 1) {\n narratorString = narratorString + ', Narr.'; \n }\n else{\n narratorString = narratorString + ', Narrs.'; \n }\n \n }\n\n //edition\n let edition = shared.getStringValue(refData.edition);\n\n let authorArray = shared.getAuthors(refData.contributors);\n\n //build our secondary contributors portion\n if ((editorString.length > 0 && authorArray.length > 0) ||\n translatorString.length > 0 ||\n editorTranslatorString.length > 0||\n narratorString.length > 0 ||\n illustratorString.length > 0 ||\n edition.length > 0 ||\n volume.length > 0) {\n \n var isFirstNames = true;\n\n titlePart = titlePart + ' (';\n\n if (editorTranslatorString.length > 0) {\n titlePart = titlePart + editorTranslatorString;\n isFirstNames = false;\n }\n\n if (editorString.length > 0 && authorArray.length > 0) {\n titlePart = titlePart + editorString;\n isFirstNames = false;\n }\n\n if (translatorString.length > 0) {\n if (isFirstNames) {\n titlePart = titlePart + translatorString; \n }\n else{\n titlePart = titlePart + '; ' + translatorString; \n }\n isFirstNames = false;\n }\n\n if (illustratorString.length > 0) {\n if (isFirstNames) {\n titlePart = titlePart + illustratorString; \n }\n else{\n titlePart = titlePart + '; ' + illustratorString; \n }\n isFirstNames = false;\n }\n\n if (narratorString.length > 0) {\n if (isFirstNames) {\n titlePart = titlePart + narratorString; \n }\n else{\n titlePart = titlePart + '; ' + narratorString; \n }\n isFirstNames = false;\n }\n\n if ((edition.length > 0 || volume.length > 0) && !isFirstNames) {\n titlePart = titlePart + ';';\n }\n\n if (edition.length > 0) {\n if (!isFirstNames) {\n titlePart = titlePart + ' ';\n isFirstNames = false;\n }\n\n edition = shared.fixEditionString(edition);\n\n titlePart = titlePart + edition;\n }\n\n if (volume.length > 0) {\n if (edition.length > 0) {\n titlePart = titlePart + ',';\n }\n\n if (!isFirstNames) {\n titlePart = titlePart + ' ';\n isFirstNames = false;\n }\n \n if (refData.type == 'series' && refData.kind == 'series') {\n titlePart = titlePart + volume + ' vols.';\n }\n else{\n titlePart = titlePart + 'Vol. ' + volume;\n }\n }\n\n titlePart = titlePart + ')';\n }\n\n //format\n let format = shared.getStringValue(refData.format);\n \n if (format.length > 0) {\n titlePart = titlePart + ' [' + format + ']';\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getChapterTitlePart(refData){\n let chapterTitle = shared.getStringValue(refData.chapterTitle);\n\n //translatedChapterTitle\n let translatedChapterTitle = shared.getStringValue(refData.translatedChapterTitle);\n\n // let translatorString = '';\n // let editorTranslatorString = '';\n // let narratorString = '';\n\n // if (refData.kind != 'journal') {\n // //translators\n // translatorString = shared.getTranslatorString(refData.contributors);\n\n // //editor tranlators\n // //if we have this here, we need to ignore the translators...it will get taken care of in Chapter Source\n // editorTranslatorString = shared.getEditorTranslatorString(refData.contributors);\n\n // if (editorTranslatorString.length > 0) {\n // translatorString = '';\n // }\n\n // //narrators\n // narratorString = shared.getNarratorString(refData.contributors);\n // }\n \n //now build the title part\n let titlePart = chapterTitle;\n \n if (translatedChapterTitle.length > 0) {\n titlePart = titlePart + ' [' + translatedChapterTitle + ']';\n }\n\n // if (translatorString.length > 0 || narratorString.length > 0) {\n // titlePart = titlePart + ' (';\n\n // titlePart = titlePart + translatorString;\n\n // if (translatorString.length > 0 && narratorString.length > 0) {\n // titlePart = titlePart + '; ';\n // }\n\n // titlePart = titlePart + narratorString;\n\n // titlePart = titlePart + ')';\n // }\n\n //check for chapterTranslators\n let translatorString = '';\n translatorString = shared.getChapterTranslatorString(refData.contributors);\n\n if (translatorString.length > 0) {\n titlePart = titlePart + ' (' + translatorString + ')';\n }\n \n //titlePart = shared.fixTitlePartClosure(titlePart);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getSourcePart(refData){\n //Crypto Press; Bigfoot Times; Nessie & Co. https://doi.org/10.1109/5.771073\n let sourcePart = '';\n let publisherString = shared.getPublisherString(refData.publishers);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n sourcePart = publisherString; \n } \n }\n\n //url\n let url = shared.getStringValue(refData.url);\n\n //doi\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n doi = shared.appendDOIURL(doi);\n\n sourcePart = sourcePart + doi;\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n //publication Date Original\n let publicationDateOriginal = shared.getStringValue(refData.originalPublicationDate);\n\n if (publicationDateOriginal.length > 0) {\n sourcePart = sourcePart + ' (Original work published ' + publicationDateOriginal + ')';\n }\n\n return sourcePart;\n}\n\nfunction getChapterSourcePart(refData){\n let chapterSourcePart = 'In';\n\n let bookEditorPart = getBookEditorPart(refData);\n let bookTitlePart = getBookTitlePart(refData);\n let bookSourcePart = getBookSourcePart(refData);\n let originalBookSourcePart = getOriginalBookSourcePart(refData);\n\n if (bookEditorPart.length > 0) {\n chapterSourcePart = chapterSourcePart + ' ' + bookEditorPart;\n }\n\n if (bookTitlePart.length > 0) {\n\n if (chapterSourcePart != 'In') {\n chapterSourcePart = chapterSourcePart + ',';\n }\n\n chapterSourcePart = chapterSourcePart + ' ' + bookTitlePart;\n }\n\n if (bookSourcePart.length > 0) {\n chapterSourcePart = chapterSourcePart + ' ' + bookSourcePart;\n }\n\n if (originalBookSourcePart.length > 0) {\n chapterSourcePart = chapterSourcePart + ' ' + originalBookSourcePart;\n }\n\n return chapterSourcePart;\n}\n\nfunction getBookEditorPart(refData){\n\n let editorTranslatorString = shared.getEditorTranslatorString(refData.contributors);\n\n if (editorTranslatorString.length > 0) {\n\n //this format needs brackets IE: (Ed. & Trans.)\n editorTranslatorString = editorTranslatorString.replace(', Ed. & Trans.', ' (Ed. & Trans.)')\n\n return editorTranslatorString;\n }\n\n let editorString = '';\n let editorArray = shared.getEditors(refData.contributors);\n let authorArray = shared.getAuthors(refData.contributors);\n let translatorArray = shared.getTranslators(refData.contributors);\n let chapterTranslatorArray = shared.getChapterTranslators(refData.contributors);\n\n if (editorArray.length > 0) {\n if (authorArray.length == 0 && translatorArray.length == 0 && chapterTranslatorArray.length == 0) {\n editorString = shared.getEditorsAtStartofRefString(editorArray);\n }\n else{\n editorString = shared.getReferenceNameString(editorArray, true);\n } \n }\n \n if (editorArray.length == 1) {\n editorString = editorString + ' (Ed.)';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ' (Eds.)';\n }\n }\n\n return editorString;\n}\n\nfunction getBookTitlePart(refData){\n let bookTitlePart = '';\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n let volumeTitle = shared.getStringValue(refData.volumeTitle);\n let volume = shared.getStringValue(refData.volume);\n let seriesVolumeTitle = '';\n\n if (seriesTitle.length > 0 || volumeTitle.length > 0) {\n\n if (seriesTitle.length > 0) {\n seriesVolumeTitle = seriesTitle;\n \n if (volume.length > 0) {\n seriesVolumeTitle = seriesVolumeTitle + ': Vol. ' + volume;\n\n //clear the volume to be ignored later\n volume = '';\n\n if (volumeTitle.length > 0) {\n seriesVolumeTitle = seriesVolumeTitle + '. ' + volumeTitle; \n }\n }\n else{\n if (volumeTitle.length > 0) {\n seriesVolumeTitle = seriesVolumeTitle + ': ' + volumeTitle;\n } \n }\n }\n else{\n seriesVolumeTitle = volumeTitle; \n }\n }\n\n if (seriesVolumeTitle.length > 0) {\n seriesVolumeTitle = seriesVolumeTitle.italicize(); \n }\n\n //book title\n let bookTitle = shared.getStringValue(refData.bookTitle);\n\n if (bookTitle.length > 0) {\n bookTitle = bookTitle.italicize();\n }\n\n //translated title\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (translatedTitle.length > 0) {\n translatedTitle = translatedTitle.italicize(); \n }\n\n let translatorString = '';\n let editorTranslatorString = '';\n let narratorString = '';\n\n if (refData.kind != 'journal') {\n //translators\n translatorString = shared.getTranslatorString(refData.contributors);\n\n //editor tranlators\n //if we have this here, we need to ignore the translators...it will get taken care of in Chapter Source\n editorTranslatorString = shared.getEditorTranslatorString(refData.contributors);\n\n if (editorTranslatorString.length > 0) {\n translatorString = '';\n }\n }\n\n //narrators\n narratorString = shared.getNarratorString(refData.contributors);\n\n //edition\n let edition = shared.getStringValue(refData.edition);\n\n if (edition.length > 0) {\n edition = shared.fixEditionString(edition);\n }\n\n //pages\n let referencePages = shared.getStringValue(refData.referencePages);\n\n if (referencePages.length > 0) {\n var label = 'p.';\n if (referencePages.includes('-') || referencePages.includes('–') || referencePages.includes(':')) {\n label = 'pp.';\n }\n\n referencePages = label + ' ' + shared.fixPageDash(referencePages);\n }\n\n //format\n let format = shared.getStringValue(refData.format);\n \n if (format.length > 0) {\n format = '[' + format + ']';\n }\n\n //Title of Book, Translated Book Title, Narrators, edition, volume, page numbers, format\n if (translatedTitle.length > 0) {\n bookTitlePart = bookTitlePart + translatedTitle;\n }\n else{\n bookTitlePart = bookTitlePart + bookTitle;\n }\n\n if (seriesVolumeTitle.length > 0) {\n bookTitlePart = bookTitlePart + seriesVolumeTitle\n }\n\n if (seriesTitle.length > 0) {\n //clear out the volume var here, so we don't use it in the next step\n volume = '';\n }\n \n var editionPart = '';\n\n if (edition.length > 0 || referencePages.length > 0 || volume.length > 0 || translatorString.length > 0 || narratorString.length > 0) {\n editionPart = editionPart + ' (';\n\n if (translatorString.length > 0) {\n editionPart = editionPart + translatorString;\n editionPart = editionPart + '; ';\n }\n\n if (narratorString.length > 0) {\n editionPart = editionPart + narratorString;\n editionPart = editionPart + '; ';\n }\n\n if (edition.length > 0) {\n editionPart = editionPart + edition; \n }\n\n if (volume.length > 0 && refData.kind != 'journal') {\n if (edition.length > 0) {\n editionPart = editionPart + ', ';\n }\n\n editionPart = editionPart + 'Vol. ' + volume;\n }\n\n if (referencePages.length > 0) {\n if (editionPart.length > 0 && !editionPart.endsWith('(') && !editionPart.endsWith(', ') && !editionPart.endsWith('; ')) {\n editionPart = editionPart + ', ';\n }\n \n editionPart = editionPart + referencePages;\n }\n\n if (editionPart.endsWith('; ')) {\n editionPart = editionPart.substring(0, editionPart.length - 2);\n }\n \n editionPart = editionPart + ')';\n }\n\n bookTitlePart = bookTitlePart + editionPart;\n \n if (format.length > 0) {\n bookTitlePart = bookTitlePart + ' ' + format;\n }\n\n bookTitlePart = shared.fixTitlePartClosure(bookTitlePart);\n\n return bookTitlePart;\n}\n\nfunction getBookSourcePart(refData){\n //Publishers, DOI/URL\n let bookSourcePart = '';\n\n let publisherString = shared.getPublisherString(refData.publishers);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != authorString && (publisherString != authorString + '.') && publisherString != '.') {\n bookSourcePart = publisherString; \n }\n \n //url\n let url = shared.getStringValue(refData.url);\n\n //doi\n let doi = shared.getStringValue(refData.doi);\n\n //publication Date Original\n let publicationDateOriginal = shared.getStringValue(refData.originalPublicationDate);\n\n if (doi.length > 0) {\n if (bookSourcePart.length > 0) {\n bookSourcePart = bookSourcePart + ' ';\n }\n\n doi = shared.appendDOIURL(doi);\n\n bookSourcePart = bookSourcePart + doi;\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (bookSourcePart.length > 0) {\n bookSourcePart = bookSourcePart + ' ';\n }\n \n bookSourcePart = bookSourcePart + url;\n }\n }\n\n if (publicationDateOriginal.length > 0 && refData.kind != 'book' && refData.kind != 'journal') {\n bookSourcePart = bookSourcePart + ' (Original work published ' + publicationDateOriginal + ')';\n }\n\n return bookSourcePart;\n}\n\nfunction getOriginalBookSourcePart(refData){\n //- Original Title, Original Pages, Original Contributors, Original Publication Date, Original Publishers\n //(Reprinted from Searching for Sasquatch, pp. 21–31, by B. B. Editorb Jr., Ed., 1987, Bigfoot Times)\n let originalBookSourcePart = ''; \n\n if (refData.kind == 'book') {\n let bookTitleOriginal = shared.getStringValue(refData.originalBookTitle);\n let originalPages = shared.getStringValue(refData.originalPages);\n\n if (originalPages.length > 0) {\n var label = 'p.';\n if (originalPages.includes('-') || originalPages.includes('–') || originalPages.includes(':')) {\n label = 'pp.';\n }\n \n originalPages = label + ' ' + originalPages;\n }\n \n let originalEditorString = shared.getOriginalEditorString(refData.contributors);\n let publicationDateOriginal = shared.getYear(refData.originalPublicationDate);\n let originalPublisherString = shared.getOriginalPublisherString(refData.publishers);\n \n //build the part\n originalBookSourcePart = '(Reprinted from ';\n\n if (bookTitleOriginal.length > 0) {\n originalBookSourcePart = originalBookSourcePart + bookTitleOriginal.italicize();\n originalBookSourcePart = originalBookSourcePart + ', '; \n }\n \n if (originalPages.length > 0) {\n originalBookSourcePart = originalBookSourcePart + originalPages;\n originalBookSourcePart = originalBookSourcePart + ', '; \n }\n\n if (originalEditorString.length > 0) {\n originalBookSourcePart = originalBookSourcePart + 'by ' + originalEditorString;\n originalBookSourcePart = originalBookSourcePart + ', '; \n }\n\n if (publicationDateOriginal.length > 0) {\n originalBookSourcePart = originalBookSourcePart + publicationDateOriginal;\n originalBookSourcePart = originalBookSourcePart + ', '; \n }\n else{\n originalBookSourcePart = originalBookSourcePart + 'n.d., '; \n }\n\n if (originalPublisherString.length > 0) {\n originalBookSourcePart = originalBookSourcePart + originalPublisherString;\n }\n\n if (originalBookSourcePart.endsWith(', ')) {\n originalBookSourcePart = originalBookSourcePart.substring(0, originalBookSourcePart.length - 2)\n }\n\n originalBookSourcePart = originalBookSourcePart + ')';\n }\n\n return originalBookSourcePart;\n}\n\nfunction getChapterJournalSourcePart(refData){\n let chapterJournalSourcePart = 'In'; \n\n //[BookEditorPart][BookTitlePart][BookSourcePart][OriginalJournalSourcePart]\n let bookEditorPart = getBookEditorPart(refData);\n let bookTitlePart = getBookTitlePart(refData);\n let bookSourcePart = getBookSourcePart(refData);\n let originalJournalSourcePart = getOriginalJournalSourcePart(refData);\n\n if (bookEditorPart.length > 0) {\n chapterJournalSourcePart = chapterJournalSourcePart + ' ' + bookEditorPart;\n }\n\n if (bookTitlePart.length > 0) {\n\n if (chapterJournalSourcePart.length > 0 && bookEditorPart.length > 0) {\n chapterJournalSourcePart = chapterJournalSourcePart + ',';\n }\n\n chapterJournalSourcePart = chapterJournalSourcePart + ' ' + bookTitlePart;\n }\n\n if (bookSourcePart.length > 0) {\n chapterJournalSourcePart = chapterJournalSourcePart + ' ' + bookSourcePart;\n }\n\n if (originalJournalSourcePart.length > 0) {\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (chapterJournalSourcePart.length > 0 && !chapterJournalSourcePart.endsWith('.') && url.length == 0 && doi.length == 0) {\n chapterJournalSourcePart = chapterJournalSourcePart + '.';\n }\n\n chapterJournalSourcePart = chapterJournalSourcePart + ' ' + originalJournalSourcePart;\n }\n\n return chapterJournalSourcePart;\n}\n\nfunction getOriginalJournalSourcePart(refData){\n let originalJournalSourcePart = '';\n //(Reprinted from \"articleTitle\" publicationDateOriginal, journalTitle, volume[issue], originalPages, doi)\n //(Reprinted from \\\"Searching for Bigfoot,\\\" 1945, Cryptozoology Today, 2[3], 21–31, https://doi.org/10.1109/5.771073)\n\n let articleTitle = shared.getStringValue(refData.articleTitle);\n let publicationDateOriginal = shared.getStringValue(refData.originalPublicationDate);\n let journalTitle = shared.getStringValue(refData.journalTitle);\n let volume = shared.getStringValue(refData.volume);\n let issue = shared.getStringValue(refData.issue);\n let originalPages = shared.getStringValue(refData.originalPages);\n let originalDoi = shared.getStringValue(refData.originalDoi);\n let originalUrl = shared.getStringValue(refData.originalUrl);\n\n originalJournalSourcePart = '(Reprinted from ';\n\n if (articleTitle.length > 0) {\n originalJournalSourcePart = originalJournalSourcePart + '\"' + articleTitle + ',\"';\n }\n\n if (publicationDateOriginal.length > 0) {\n if (!originalJournalSourcePart.endsWith(' ')) {\n originalJournalSourcePart = originalJournalSourcePart + ' ';\n }\n originalJournalSourcePart = originalJournalSourcePart + publicationDateOriginal;\n }\n else{\n if (!originalJournalSourcePart.endsWith(' ')) {\n originalJournalSourcePart = originalJournalSourcePart + ' ';\n }\n\n originalJournalSourcePart = originalJournalSourcePart + 'n.d.'; \n }\n\n if (journalTitle.length > 0) {\n if (!originalJournalSourcePart.endsWith(',') || !originalJournalSourcePart.endsWith(',\"')) {\n originalJournalSourcePart = originalJournalSourcePart + ', ';\n }\n\n originalJournalSourcePart = originalJournalSourcePart + journalTitle.italicize();\n }\n\n //if there is no volume and there is an issue, replace it\n if (volume.length == 0 && issue.length > 0) {\n volume = issue;\n issue = '';\n }\n\n if (volume.length > 0) {\n if (!originalJournalSourcePart.endsWith(',') || !originalJournalSourcePart.endsWith(',\"')) {\n\n if (originalJournalSourcePart.endsWith('!') \n || originalJournalSourcePart.endsWith('?') \n || originalJournalSourcePart.endsWith('.')) {\n originalJournalSourcePart = originalJournalSourcePart + ' ';\n }\n else{\n originalJournalSourcePart = originalJournalSourcePart + ', ';\n }\n }\n \n originalJournalSourcePart = originalJournalSourcePart + volume.italicize();\n\n if (issue.length > 0) {\n originalJournalSourcePart = originalJournalSourcePart + '[' + issue + ']';\n }\n }\n\n if (originalPages.length > 0) {\n if (!originalJournalSourcePart.endsWith(',') || !originalJournalSourcePart.endsWith(',\"')) {\n originalJournalSourcePart = originalJournalSourcePart + ', ';\n }\n\n originalJournalSourcePart = originalJournalSourcePart + shared.fixPageDash(originalPages);\n }\n\n if (originalDoi.length > 0) {\n if (!originalJournalSourcePart.endsWith(',') || !originalJournalSourcePart.endsWith(',\"')) {\n originalJournalSourcePart = originalJournalSourcePart + ', ';\n }\n\n originalJournalSourcePart = originalJournalSourcePart + shared.appendDOIURL(originalDoi);\n }\n else{\n if (originalUrl.length > 0) {\n if (!originalJournalSourcePart.endsWith(',') || !originalJournalSourcePart.endsWith(',\"')) {\n originalJournalSourcePart = originalJournalSourcePart + ', ';\n }\n \n originalUrl = shared.formatURL(originalUrl);\n originalJournalSourcePart = originalJournalSourcePart + originalUrl;\n }\n }\n \n originalJournalSourcePart = originalJournalSourcePart + ')';\n\n return originalJournalSourcePart;\n}\n\nfunction getVolumeEditors(contributors){\n let editorArray = [];\n\n contributors = shared.removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'volumeEditor') {\n editorArray.push(item);\n }\n });\n\n return editorArray;\n}","/*\n*****Brochures*****\n \nDocumentation: TODO: Include a link to the Google Document for this type here\n\nType & Kind Questions\n\nThere aren't any type/kinds for brochures or pamplets. Also, legacy brochures are converted as books because book & brochure are combined in APA 6. There isn't a way to separate them out in conversion.\n\n[Author Part] [Date Part] [Title Part] [Source Part]\n\nAuthor Part\n - Author names, Group Authors, Editors without Authors\n\nDate Part\n - Publication Date or n.d.\n\nTitle Part\n - Title of the brochure, description in brackets if no title, editors, translators\n\nSource Part\n - Publishers\n - DOI or URL\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n \n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n\n if (titlePart.length > 0) {\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + sourcePart;\n }\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.title);\n title = shared.stripSubtitle(title);\n\n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n authorString = title.toTitleCase().italicize(); \n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n //- Entry title or description, Blog title\n //Blog entry title. Blog Name.\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n let authorArray = shared.getAuthors(refData.contributors);\n let editorArray = shared.getEditors(refData.contributors);\n \n //entry title has aleady been used if there aren't any authors\n if (title.length > 0 && (authorArray.length != 0 || editorArray.length != 0)) {\n if (title.startsWith('[')) {\n titlePart = title; \n }\n else{\n titlePart = title.italicize(); \n } \n }\n\n //translated title\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (translatedTitle.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[' + translatedTitle + ']';\n }\n\n //editors\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n\n //translators\n let translatorString = shared.getTranslatorString(refData.contributors);\n\n //editor and translator string\n //this is only the scenario where they all match and we don't need the individual string\n let editorTranslatorString = shared.getEditorTranslatorString(refData.contributors);\n\n if (editorTranslatorString.length >0) {\n editorString = '';\n translatorString = '';\n }\n\n //build our secondary contributors portion\n if ((editorString.length > 0 && authorArray.length > 0) ||\n translatorString.length > 0 ||\n editorTranslatorString.length > 0) {\n \n var isFirstNames = true;\n\n titlePart = titlePart + ' (';\n\n if (editorTranslatorString.length > 0) {\n titlePart = titlePart + editorTranslatorString;\n isFirstNames = false;\n }\n\n if (editorString.length > 0 && authorArray.length > 0) {\n titlePart = titlePart + editorString;\n isFirstNames = false;\n }\n\n if (translatorString.length > 0) {\n if (isFirstNames) {\n titlePart = titlePart + translatorString; \n }\n else{\n titlePart = titlePart + '; ' + translatorString; \n }\n isFirstNames = false;\n }\n\n titlePart = titlePart + ')';\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors, unless this is an entry\n if (editorArray.length > 0) {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n if (authorPart.length == 0) {\n //use our title instead\n let title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n\n if (title.startsWith('[')) {\n authorPart = title;\n }\n else{\n authorPart = title.italicize(); \n }\n }\n }\n\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n //Publisher, DOI, URL\n let sourcePart = '';\n\n let publisherString = shared.getPublisherString(refData.publishers);\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n sourcePart = publisherString; \n } \n }\n\n if (doi.length > 0) {\n\n doi = shared.appendDOIURL(doi);\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + doi;\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n return sourcePart;\n}","/*\n*****ChartsMaps*****\n \nFORM: https://docs.google.com/spreadsheets/d/1ZwyesSuwmmZbJ4mmwv-dOzoYMUl_s4aIvqr9tv-XrMc/edit#gid=2071428744\nMOCKUP: https://magical-design-system.webflow.io/add-in/wizard/wizard-2-charts-infographics-maps\n\nBASIC LAYOUT\n [contributors]. ([publicationDate]). [title] [[description]]. [pubishers]. [url]\n\nTYPES & KINDS\n - There are none\n\nAuthorPart\n contributor.author\n - Normal authors\n contributor.username\n - Normal username\n contributor.groupAuthor\n - Normal group authors\n title\n - if there aren't any contributors, put the title here\n\nDatePart\n publicationDate\n - Normal date in YYYY\n\nTitlePart\n [title]\n - Normal title part\n [description]\n - This is similar to format, but if the title starts with \"[\" then don't include this. If the title is a description, then the format should be included there (e.g., \"Map of sasquatch sightings\" includes \"Map\"). \n\nSourcePart\n publisher.reference\n - Normal publishers\n url\n - Normal url\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let referenceValue = '';\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.title);\n let description = shared.getStringValue(refData.description);\n\n if (title.length > 0) {\n authorString = title.toTitleCase().italicize();\n }\n else{\n authorString = '[' + description + ']';\n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n else{\n year = shared.fixPageDash(year);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0) {\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n let description = shared.getStringValue(refData.description);\n\n if (title.length > 0) {\n titlePart = title.italicize();\n }\n\n if (description.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[' + description + ']';\n }\n\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart);\n }\n\n return titlePart;\n}\n\nfunction getSourcePart(refData){\n let sourcePart = '';\n let url = shared.getStringValue(refData.url);\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n let publisherString = shared.getPublisherString(refData.publishers);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n sourcePart = publisherString; \n } \n }\n\n if (retrievalDate.length > 0) {\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + 'Retrieved';\n sourcePart = sourcePart + ' ' + shared.formatRetrievalDate(retrievalDate);\n sourcePart = sourcePart + ', from';\n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}","/*\n*****ConferenceMaterials*****\n \nFORM: https://docs.google.com/spreadsheets/d/1LuvOrew1KaBXoz30pgNYep2l4cT9g-sUcaq5p36rvQw/edit#gid=2071428744\nMOCKUP: https://magical-design-system.webflow.io/add-in/wizard/wizard-2-conference-symposium\n\nTYPES:\n conference\n - A conference session or presentation\n [contributor.author]. ([publicationDate combined with endDate]). [title] [[description]]. [conference], [city], [state], [country]. [url or doi]\"\n symposium\n - Material presented at a symposium\n [contributor.author]. ([publicationDate combined with endDate]). [title]. In [contributor.chair] (Chair *or* Chairs), [symposiumTitle]. [conference], [city], [state], [country].\n\nAuthorPart\n contributor.author\n - Normal author behavior\n\nDatePart\n publicationDate & endDate\n - if there is only publicationDate, then format as YYYY, MM DD\n - If there is a publicationDate and an endDate, then it should be YYYY, MM DD–DD (e.g., 2020, April 1–3 or 2020, March 30–April 1)\n - always uses an en-dash (Option & -)\n - No date = n.d.\n\nTitlePart\n title\n - italicize in conference, but don't in symposium\n description\n - Happens in conference, inside brackets after the title\n - in symposium, the description is always the same & input automatically \"[Symposium]\"\n\nSourcePart\n contributor.chair\n - for symposium, we have secondary contributors (similar to Editors)\n - Follows the title\n - Always preceeded by \"In \"\n - If there is only one, follow with \"[Chair}\"\n - If there are multiple, follow with \"[Chairs]\"\n - Names follow normal mutli-contributor rules (1, 2+, or 20+)\n conference\n - The name of the conferece\n - Italicize for symposium\n city\n - name of the city, nothing special\n state\n - Two letter abbreviation for the state\n - if they do more, whatever\n country\n - Name of the country\n url/doi\n - typical URL & DOI\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let referenceValue = '';\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.title);\n \n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n authorString = title.toTitleCase().italicize(); \n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n else{\n year = shared.fixPageDash(year);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0) {\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let endDate = shared.getStringValue(refData.endDate);\n let formattedDate = '';\n let datePart = '';\n\n if (endDate.length > 0) {\n formattedDate = shared.getFullDateRange(publicationDate, endDate);\n }\n else{\n formattedDate = shared.getFullDate(publicationDate);\n }\n\n datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let type = shared.getStringValue(refData.type);\n let title = shared.getStringValue(refData.title);\n let description = shared.getStringValue(refData.description);\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n titlePart = title;\n }\n else{\n\n if (type == 'conference') {\n titlePart = title.italicize(); \n } \n else{\n titlePart = title;\n }\n }\n }\n\n if (description.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[' + description + ']';\n }\n\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart);\n }\n\n return titlePart;\n}\n\nfunction getSourcePart(refData){\n let sourcePart = '';\n\n //chair\n let chairArray = shared.getChairs(refData.contributors);\n let chairString = shared.getReferenceNameString(chairArray, true);\n\n if (chairArray.length == 1) {\n chairString = chairString + ' (Chair)';\n }\n else{\n if (chairArray.length > 1) {\n chairString = chairString + ' (Chairs)';\n }\n }\n\n let symposiumTitle = shared.getStringValue(refData.symposiumTitle);\n let conference = shared.getStringValue(refData.conference);\n let city = shared.getStringValue(refData.city);\n let state = shared.getStringValue(refData.state);\n let country = shared.getStringValue(refData.country);\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n let type = shared.getStringValue(refData.type);\n\n if (chairString.length > 0) {\n sourcePart = chairString;\n }\n\n if (symposiumTitle.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', ';\n }\n\n sourcePart = sourcePart + symposiumTitle.italicize() + ' [Symposium].'; \n }\n\n if (conference.length > 0) {\n if (sourcePart.length > 0) {\n\n if (sourcePart.endsWith('.')) {\n sourcePart = sourcePart + ' ';\n }\n else{\n sourcePart = sourcePart + '. ';\n }\n }\n\n sourcePart = sourcePart + conference;\n }\n\n if (city.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', ';\n }\n\n sourcePart = sourcePart + city;\n }\n\n if (state.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', ';\n }\n\n sourcePart = sourcePart + state;\n }\n\n if (country.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', ';\n }\n\n sourcePart = sourcePart + country;\n }\n\n if (sourcePart.length > 0) {\n if (!sourcePart.endsWith('.')) {\n sourcePart = sourcePart + '.';\n }\n }\n\n if (doi.length > 0) {\n\n doi = shared.appendDOIURL(doi);\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + doi;\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n if (sourcePart.length > 0 && type == 'symposium') {\n sourcePart = 'In ' + sourcePart;\n }\n\n return sourcePart;\n}","/*\n*****Constitutions*****\n \nFORM: https://docs.google.com/spreadsheets/d/1v3lHaILY_D_os-6fRGmlnGLnYJSmMp-r1lk5yO9gjKY/edit#gid=2071428744\nMOCKUP: http://magical-design-system.webflow.io/add-in/wizard/wizard-2-constitutions-charters\n\nType & Kind Questions\n - us: United States Constitution\n - article: Article(s) of the US Constitution\n - amendment: Amendment(s) to the US Constitution\n - repealed: Repealed amendment to the US Constitution\n - state: State Constitution\n - article: Article(s) of a state Constitution\n - amendment: Amendment(s) to a state Constitution\n - repealed: Repealed amendment to a state Constitution\n - charter: an organizational charter\n\nParts\n - us article: U.S. Const. art. [article], § [section].\n - us amendment: U.S. Const. amend. [amendment].\n - us repealed: U.S. Const. amend. [amendment]. (repealed [repealDate]).\n\n - state article: [state] Const. art. [article], § [secrtion].\n - state amendment: [state] Const. amend. [amendment].\n - state repealed: [state] Const. amend. [amendment]. (repealed [repealDate]).\n \n - charter: [title] art. [charterArticle], para. [paragraph].\n\n*/\n\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let article = shared.getStringValue(refData.article);\n let section = shared.getStringValue(refData.section);\n let amendment = shared.getStringValue(refData.amendment);\n let repealDate = shared.getStringValue(refData.repealDate);\n let state = shared.getStringValue(refData.state);\n let title = shared.getStringValue(refData.title);\n let charterArticle = shared.getStringValue(refData.charterArticle);\n let paragraph = shared.getStringValue(refData.paragraph);\n let label = '';\n\n section = formatSectionString(section);\n paragraph = formatPargraphString(paragraph);\n\n switch (type) {\n case 'us':\n referenceValue = 'U.S. Const.';\n\n switch (kind) {\n case 'article':\n label = 'art.';\n break;\n case 'amendment':\n case 'repealed':\n label = 'amend.';\n break;\n }\n\n referenceValue = referenceValue + ' ' + label;\n\n if (kind == 'article') {\n if (article.length > 0) {\n referenceValue = referenceValue + ' ' + article;\n\n if (section.length > 0) {\n referenceValue = referenceValue + ',';\n }\n }\n\n if (section.length > 0) {\n referenceValue = referenceValue + ' ' + section;\n }\n\n referenceValue = referenceValue + '.';\n }\n else{\n if (amendment.length > 0) {\n referenceValue = referenceValue + ' ' + amendment;\n }\n\n if (repealDate.length > 0) {\n referenceValue = referenceValue + ' (repealed ' + repealDate +').';\n }\n }\n\n if (!referenceValue.endsWith('.')) {\n referenceValue = referenceValue + '.';\n }\n\n break;\n case 'state':\n\n if (state.length > 0) {\n referenceValue = state;\n }\n\n switch (kind) {\n case 'article':\n label = 'Const. art.';\n break;\n case 'amendment':\n case 'repealed':\n label = 'Const. amend.';\n break;\n }\n\n referenceValue = referenceValue + ' ' + label;\n\n if (kind == 'article') {\n if (article.length > 0) {\n referenceValue = referenceValue + ' ' + article;\n\n if (section.length > 0) {\n referenceValue = referenceValue + ',';\n }\n }\n\n if (section.length > 0) {\n referenceValue = referenceValue + ' ' + section;\n }\n\n referenceValue = referenceValue + '.';\n }\n else{\n if (amendment.length > 0) {\n referenceValue = referenceValue + ' ' + amendment;\n }\n\n if (repealDate.length > 0) {\n referenceValue = referenceValue + ' (repealed ' + repealDate +').';\n }\n }\n\n if (!referenceValue.endsWith('.')) {\n referenceValue = referenceValue + '.';\n }\n\n break;\n case 'charter':\n if (title.length > 0) {\n referenceValue = title;\n }\n\n referenceValue = referenceValue + ' art.';\n\n if (charterArticle.length > 0) {\n referenceValue = referenceValue + ' ' + charterArticle;\n } \n\n if (paragraph.length > 0) {\n if (charterArticle.length > 0) {\n referenceValue = referenceValue + ',';\n } \n\n referenceValue = referenceValue + ' ' + paragraph;\n }\n\n if (!referenceValue.endsWith('.')) {\n referenceValue = referenceValue + '.';\n }\n\n break;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: '',\n datePart: ''\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData) {\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n let authorString = '';\n\n let article = shared.getStringValue(refData.article);\n let section = shared.getStringValue(refData.section);\n let amendment = shared.getStringValue(refData.amendment);\n let repealDate = shared.getStringValue(refData.repealDate);\n let state = shared.getStringValue(refData.state);\n let title = shared.getStringValue(refData.title);\n let charterArticle = shared.getStringValue(refData.charterArticle);\n let paragraph = shared.getStringValue(refData.paragraph);\n let label = '';\n\n section = formatSectionString(section);\n paragraph = formatPargraphString(paragraph);\n\n switch (type) {\n case 'us':\n authorString = 'U.S. Const.';\n\n switch (kind) {\n case 'article':\n label = 'art.';\n break;\n case 'amendment':\n case 'repealed':\n label = 'amend.';\n break;\n }\n\n authorString = authorString + ' ' + label;\n\n if (kind == 'article') {\n if (article.length > 0) {\n authorString = authorString + ' ' + article;\n\n if (section.length > 0) {\n authorString = authorString + ',';\n }\n }\n\n if (section.length > 0) {\n authorString = authorString + ' ' + section;\n }\n }\n else{\n if (amendment.length > 0) {\n authorString = authorString + ' ' + amendment;\n }\n\n if (repealDate.length > 0) {\n authorString = authorString + ', repealed ' + repealDate;\n }\n }\n\n break;\n case 'state':\n if (state.length > 0) {\n authorString = state;\n }\n\n switch (kind) {\n case 'article':\n label = 'Const. art.';\n break;\n case 'amendment':\n case 'repealed':\n label = 'Const. amend.';\n break;\n }\n\n authorString = authorString + ' ' + label;\n\n if (kind == 'article') {\n if (article.length > 0) {\n authorString = authorString + ' ' + article;\n\n if (section.length > 0) {\n authorString = authorString + ',';\n }\n }\n\n if (section.length > 0) {\n authorString = authorString + ' ' + section;\n }\n }\n else{\n if (amendment.length > 0) {\n authorString = authorString + ' ' + amendment;\n }\n\n if (repealDate.length > 0) {\n authorString = authorString + ' (repealed ' + repealDate + ')';\n }\n }\n\n break;\n case 'charter':\n\n if (title.length > 0) {\n authorString = title;\n }\n\n authorString = authorString + ' art.';\n\n if (charterArticle.length > 0) {\n authorString = authorString + ' ' + charterArticle;\n } \n\n if (paragraph.length > 0) {\n if (charterArticle.length > 0) {\n authorString = authorString + ',';\n } \n\n authorString = authorString + ' ' + paragraph;\n }\n\n break;\n }\n\n let year = '';\n\n let citation = shared.getCitations(citationData, authorString, year, []);\n\n return citation;\n}\n\nfunction formatSectionString(section){\n let prefix = '§';\n\n if (section.length == 0) {\n return '';\n }\n\n if (section.includes('-') || section.includes('–') || section.includes('—')) {\n prefix = '§§';\n }\n\n section = prefix + ' ' + section; \n \n return section;\n}\n\nfunction formatPargraphString(paragraph){\n let prefix = 'para.';\n\n if (paragraph.length == 0) {\n return '';\n }\n\n if (paragraph.includes('-') || paragraph.includes('–') || paragraph.includes('—')) {\n prefix = 'paras.';\n }\n\n paragraph = prefix + ' ' + paragraph; \n \n return paragraph;\n}","/*\n*****Datasets*****\n \nFORM: https://docs.google.com/spreadsheets/d/1X1numWbp1h96m3QvtQWrU40WD6ahWlARAeY5qZryazM/edit#gid=2071428744\nMOCKUP: https://magical-design-system.webflow.io/add-in/wizard/wizard-2-datasets\n\nTYPES:\n published: published data sets\n [contributors]. ([publicationDate]). [title] ([version]) [Data set]. [publishers]. [doi/url]\n raw: unpublished \n [contributors]. ([publicationDate]). [title] ([version]) [Unpublished raw data]. [publishers]. Retrieved [retrievalDate] from, [doi/url]\n\nAuthorPart\n contributors\n - Author or Group Author\n - Include Title if there are no contributors\n\nDatePart\n publicationDate\n - Normal Date in YYYY\n\nTitlePart\n title\n - italicized\n - If the title is a description (including brackets), do not include \"[Data set]\" or \"[Unpublished raw data]\" in the title part.\n version\n - place in parentheses after the title\n\nSourcePart\n publishers\n - Normal for publisher.reference\n retrievalDate\n - optional for unpublished raw data\n url/doi\n - normal url/doi\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let referenceValue = '';\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.title);\n let description = shared.getStringValue(refData.description);\n\n if (title.length > 0) {\n authorString = title.toTitleCase().italicize();\n }\n else{\n authorString = '[' + description + ']';\n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n else{\n year = shared.fixPageDash(year);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0) {\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let type = shared.getStringValue(refData.type);\n let title = shared.getStringValue(refData.title);\n let version = shared.getStringValue(refData.version);\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n titlePart = title;\n }\n else{\n titlePart = title.italicize(); \n }\n }\n\n if (version.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '(' + version + ')';\n }\n\n let label = '';\n switch (type) {\n case 'published':\n label = '[Data set]';\n break;\n case 'raw':\n label = '[Unpublished raw data]';\n break;\n }\n\n if (label.length > 0 && !titlePart.startsWith('[')) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + label;\n }\n\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart);\n }\n\n return titlePart;\n}\n\nfunction getSourcePart(refData){\n let sourcePart = '';\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n let publisherString = shared.getPublisherString(refData.publishers);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n sourcePart = publisherString; \n } \n }\n\n if (retrievalDate.length > 0) {\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + 'Retrieved';\n sourcePart = sourcePart + ' ' + shared.formatRetrievalDate(retrievalDate);\n sourcePart = sourcePart + ', from';\n }\n\n if (doi.length > 0) {\n\n doi = shared.appendDOIURL(doi);\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + doi;\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n return sourcePart;\n}","/*\n*****Dissertations*****\n \nFORM: https://docs.google.com/spreadsheets/d/14m_yBa82BBDm7gG6z8KB4rmh3aqvxfjXvhMseYgN9kI/edit#gid=2071428744\nMOCKUP: https://magical-design-system.webflow.io/add-in/wizard/wizard-2-dissertations-theses\n\nTYPES\n - published: Published dissertations or theses\n - unpublished: Unpublished dissertations or theses\nKINDS\n - doctorate: Doctoral level work. This is an option for both types.\n - masters: Master's level work. This is an option for both types. \n\npublished doctorate\n - [contributor.author]. ([publicationDate]). [title] ([record]) [Doctoral dissertation, [institution]]. [database]. [url]\npublished masters\n - [contributor.author]. ([publicationDate]). [title] ([record]) [Master's thesis, [institution]]. [database]. [url]\nunpublished doctorate\n - [contributor.author]. ([publicationDate]). [title] [Unpublished doctoral dissertation]. [institution]. [url]\nunpublished masters\n - [contributor.author]. ([publicationDate]). [title] [Unpublished master's thesis]. [institution]. [url]\n\nAuthorPart\n contributor.author\n - normal\n Ends with period\n\nDatePart\n publicationDate\n - normal, YYYY\n Ends with period\n\nTitlePart\n title\n - italicize\n record\n - placed in parentheses after the title\n - omit parentheses if missing\n institution\n - if published, placed in brackets after the title & institution\n Ends with a period\n\nSourcePart\n institution\n - first part of SourcePart if unpublished\n - period afterwards\n url\n - normal\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let referenceValue = '';\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.title);\n title = shared.stripSubtitle(title);\n\n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n authorString = title.toTitleCase().italicize(); \n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n else{\n year = shared.fixPageDash(year);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0) {\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n let title = shared.getStringValue(refData.title);\n let institution = shared.getStringValue(refData.institution);\n let record = shared.getStringValue(refData.record);\n let label = '';\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n titlePart = title;\n }\n else{\n titlePart = title.italicize();\n }\n }\n\n if (record.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '(' + record + ')';\n }\n\n if (type == 'published' && kind == 'doctorate') {\n label = 'Doctoral dissertation';\n }\n\n if (type == 'published' && kind == 'masters') {\n label = \"Master's thesis\";\n }\n\n if (type == 'unpublished' && kind == 'doctorate') {\n label = 'Unpublished doctoral dissertation';\n }\n\n if (type == 'unpublished' && kind == 'masters') {\n label = \"Unpublished master's thesis\";\n }\n\n //if published, include the institution in the label\n if (type == 'published' && institution.length > 0) {\n if (label.length > 0) {\n label = label + ', '\n }\n\n label = label + institution;\n }\n\n if (label.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[' + label + ']';\n }\n\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart);\n }\n\n return titlePart;\n}\n\nfunction getSourcePart(refData){\n let sourcePart = '';\n\n let type = shared.getStringValue(refData.type);\n let institution = shared.getStringValue(refData.institution);\n let database = shared.getStringValue(refData.database);\n let url = shared.getStringValue(refData.url);\n \n if (type == 'unpublished' && institution.length > 0) {\n sourcePart = institution;\n\n if (!sourcePart.endsWith('.')) {\n sourcePart = sourcePart + '.';\n }\n }\n\n if (database.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + database;\n\n if (!sourcePart.endsWith('.')) {\n sourcePart = sourcePart + '.';\n }\n }\n \n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}","module.exports = {\n getReference,\n getCitation\n}\n \nfunction getReference(type, refData){\n var typeEngine = getTypeEngine(type);\n var reference = typeEngine.getReference(refData);\n \n return reference;\n}\n\nfunction getCitation(type, refData, citationData, paperRefs){\n var typeEngine = getTypeEngine(type);\n var citation = typeEngine.getCitation(refData, citationData, paperRefs);\n \n //add the brackets around the citation\n if (citation.first.length > 0) {\n citation.first = \"(\" + citation.first + \")\"; \n }\n \n if (citation.subsequent.length > 0) {\n citation.subsequent = \"(\" + citation.subsequent + \")\"; \n }\n\n return citation;\n}\n\nfunction getTypeEngine(type){\n var typeEngine = null;\n\n typeEngine = require('./APA7-' + type +'.js');\n\n return typeEngine;\n}","/*\n*****ExecutiveOrders*****\n \nDocumentation: https://docs.google.com/spreadsheets/d/1LbxrNtaVJ9qquMV-FvS0ej4C-_9Bcf0CpyoDPDkyP0U/edit#gid=1084144617\n\nMockup: http://magical-design-system.webflow.io/add-in/wizard/wizard-2-executive-orders\n\nType & Kind Questions\n- Types & Kinds: \n There are no types or kinds\n\nPARTS\n - orderNumber: the number of the order. It should use commas appropriately for long numbers (e.g. 12,345)\n - pageNumber: the starting page number for the record\n - publicationDate: the year the executive order was given\n - url: url for the bill/resolution\n\nExample\n Exec. Order No. [orderNumber], 3. C.F.R. [pageNumber] ([publicationDate]). [url]\n*/\n\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n\n //Exec. Order No. 12,345. 3 C.F.R. 345 (2018). https://www.perrla.com/executiveorder\n\n let orderNumber = shared.getStringValue(refData.orderNumber);\n let pageNumber = shared.getStringValue(refData.pageNumber);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let url = shared.getStringValue(refData.url);\n\n if (orderNumber.length > 0) {\n referenceValue = 'Exec. Order No. ' + shared.addCommasToNumber(orderNumber) + ',';\n }\n\n if (pageNumber.length > 0) {\n\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' ';\n }\n\n referenceValue = referenceValue + '3 C.F.R. ' + pageNumber;\n }\n\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' ';\n }\n \n if (publicationDate.length > 0) {\n let year = shared.getYear(publicationDate);\n referenceValue = referenceValue + '(' + year + ')';\n }\n else{\n referenceValue = referenceValue + '(n.d.)';\n }\n\n referenceValue = referenceValue + '.';\n\n if (url.length) {\n url = shared.formatURL(url);\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' ';\n }\n\n referenceValue = referenceValue + url;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: '',\n datePart: ''\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData) {\n let authorString = '';\n let orderNumber = shared.getStringValue(refData.orderNumber);\n let year = shared.getYear(refData.publicationDate);\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n if (orderNumber.length > 0) {\n authorString = 'Exec. Order No. ' + shared.addCommasToNumber(orderNumber);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, []);\n\n return citation;\n}","/*\n*****Films*****\n\nType & Kind Questions\nThere aren't any type/kind questions for film/movies\n\nDocument the parts and their fields here\nAuthorPart\n - Director (contributor.author) + \"(Director)\", Custom Role (contributor.custom) + \"([contributor.custom.name])\"\n\nDatePart\n - Publication Date\n\nTitlePart\n - title, \"[Film]\", format (if included, inside brackets with \"Film\" but separated by semi-colon)\n\nSourcePart\n - publisher.reference, url\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n \n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'custom' || item.type == 'director') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n let title = shared.getStringValue(refData.title);\n title = shared.stripSubtitle(title);\n\n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n authorString = title.italicize(); \n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n //pad minutes and seconds\n if (citationData.type == 'time') {\n if (citationData.value.length > 0) {\n citationData.value = shared.fixTimeCitationData(citationData.value);\n // let dataArray = citationData.value.split('/');\n\n // switch (dataArray.length) {\n // case 2:\n // if (dataArray[1].length == 1) {\n // dataArray[1] = '0' + dataArray[1]\n // }\n // break;\n \n // case 3:\n // if (dataArray[1].length == 1) {\n // dataArray[1] = '0' + dataArray[1]\n // }\n\n // if (dataArray[2].length == 1) {\n // dataArray[2] = '0' + dataArray[2]\n // }\n // break;\n // }\n\n // citationData.value = dataArray.join('/');\n }\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n //since time is treated differently here than from other places, replace / with :\n if (citationData.type == 'time') {\n citation.first = citation.first.split(\"/\").join(\":\");\n citation.first = citation.first.replace('<:em>', '');\n\n citation.subsequent = citation.subsequent.split(\"/\").join(\":\");\n }\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n //- title, \"[Film]\", format (if included, inside brackets with \"Film\" but separated by semi-colon)\n //Title of the film: Subtitle of the film [Film; Educational DVD].\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n let format = shared.getStringValue(refData.format);\n\n if (title.length > 0) {\n\n if (title.startsWith('[')) {\n titlePart = title; \n }\n else{\n titlePart = title.italicize(); \n }\n\n if (refData.type == 'foreign') {\n if (translatedTitle.length > 0) {\n titlePart = titlePart + ' [' + translatedTitle + ']'; \n } \n }\n\n titlePart = titlePart + ' [Film';\n\n if (format.length > 0) {\n titlePart = titlePart + '; ' + format;\n }\n\n titlePart = titlePart + ']';\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n //- Director (contributor.author) + \"(Director)\", Custom Role (contributor.custom) + \"([contributor.custom.name])\"\n let authorPart = '';\n\n //this gets really customized based off what data is entered.\n //if they are all \"authors\", then it's just director, directors\n //otherwise, we have to do each one indivisually\n\n if (typeof refData.contributors === 'undefined') {\n return '';\n }\n\n if (refData.contributors.length == 0) {\n return '';\n }\n\n let authorArray = shared.getAuthors(refData.contributors);\n\n if (authorArray.length == refData.contributors.length) {\n //all directors\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n if (authorArray.length == 1) {\n authorPart = authorString + ' (Director)';\n }\n else{\n authorPart = authorString + ' (Directors)';\n }\n }\n else{\n //customized here\n authorPart = getFilmReferenceNameString(refData.contributors)\n }\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n //- publisher.reference, url\n let sourcePart = '';\n let publisherString = shared.getPublisherString(refData.publishers);\n let url = shared.getStringValue(refData.url);\n\n if (publisherString != '.') {\n sourcePart = publisherString; \n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}\n\nfunction getFilmReferenceNameString(contributors){\n var contributorstring = '';\n\n if (contributors.length > 0) {\n\n //Single\n if (contributors.length == 1) {\n contributorstring = shared.getReferenceName(contributors[0]);\n\n let label = getCustomNameLabel(contributors[0]);\n\n if (label.length > 0) {\n contributorstring = contributorstring + ' ' + label;\n }\n }\n\n //2-20\n if (contributors.length > 1 && contributors.length < 21) {\n var counter = 0;\n\n _forEach(contributors, (item) => {\n\n if (counter > 0) {\n\n if (counter == contributors.length - 1) {\n contributorstring = contributorstring + ', & '\n }\n else{\n contributorstring = contributorstring + ', '\n }\n }\n\n contributorstring = contributorstring + shared.getReferenceName(item);\n\n let label = getCustomNameLabel(contributors[counter]);\n\n if (label.length > 0) {\n contributorstring = contributorstring + ' ' + label;\n }\n\n counter++;\n });\n }\n\n //More Than Twenty\n if (contributors.length > 20) {\n var counter = 0;\n\n _forEach(contributors, (item) => {\n\n let label = getCustomNameLabel(item);\n\n if (counter < 19) {\n if (counter > 0) {\n contributorstring = contributorstring + ', ' \n }\n contributorstring = contributorstring + shared.getReferenceName(item);\n }\n else{\n if (counter == contributors.length - 1) {\n contributorstring = contributorstring + ',...'\n contributorstring = contributorstring + shared.getReferenceName(item);\n }\n }\n\n if (label.length > 0) {\n contributorstring = contributorstring + ' ' + label;\n }\n\n counter++;\n });\n }\n }\n \n return contributorstring;\n}\n\nfunction getCustomNameLabel(contributor){\n let label = '';\n\n if (contributor.type == 'author') {\n label = '(Director)';\n }\n else{\n //custom\n let customLabel = shared.getStringValue(contributor.name);\n\n if (customLabel.length > 0) {\n label = '(' + customLabel + ')';\n }\n }\n\n return label;\n}","const _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\n//Breakdown Notes\n/*\nNo type & kind\n\n[AuthorPart] [DatePart] [TitlePart] [SourcePart]\n\nAuthorPart\n - Principle investigators, group authors\n - Inverted names\n\nDatePart\n - Project start & end date\n\nTitlePart\n - Title of the grant, grant or project number, \"[Grant]\"\n\nSourcePart\n - Funding Institute/Center, URL\n\n*/\n\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n \n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n authorString = refData.title.toTitleCase().italicize();\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n //Title of the grant: Subtitle of the grant (Grant description number 12345) [Grant].\n //- Title of the grant, grant or project number, \"[Grant]\"\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n \n if (title.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n if (title.startsWith('[')) {\n titlePart = title;\n }\n else{\n titlePart = title.italicize(); \n } \n }\n\n let description = shared.getStringValue(refData.description);\n\n if (description.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '(' + description + ')';\n }\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' [Grant].';\n }\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n\n if (!authorArray[authorArray.length - 1].type == 'groupAuthor') {\n authorPart = authorPart + '.'\n }\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors, unless this is an entry\n if (editorArray.length > 0 && refData.type != 'entry') {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n if (authorPart.length > 0) {\n\n if (authorArray.length == 1) {\n authorPart = authorPart + ' (Principal Investigator).';\n }\n else{\n authorPart = authorPart + ' (Principal Investigators).';\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n //Funding Institute/Center, URL\n //Grant Institution; Grant Institution B; Grant Institution C. https://www.perrla.com/grant\"\n let sourcePart = '';\n //format these like publishers\n let institutionString = shared.getPublisherString(refData.institution);\n\n if (institutionString != '.') {\n\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n if (institutionString != authorString + '.') {\n sourcePart = institutionString;\n }\n }\n\n //url\n let url = shared.getStringValue(refData.url);\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}","const _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\n//Breakdown Notes\n/*\nType Question\nKind Quesstion\n\n-Type: (report) Reports: Annual, Research, Technical, etc.\n - (whole) All or part of a report\n (AuthorPart) (DatePart) (TitlePart) (SourcePart)\n - (series) A report in a series\n (AuthorPart) (DatePart) (SeriesTitlePart) (SourcePart)\n\n-Type: (brief) Briefs & Evaluations\n - (whole) All or part of a brief/evaluation\n (AuthorPart) (DatePart) (TitlePart) (SourcePart)\n - (series) A brief/evaluation in a series\n (AuthorPart) (DatePart) (SeriesTitlePart) (SourcePart)\n\n-Type: (codes) Codes & Guidelines\n - (whole) All or part of a set of codes/guidelines\n (AuthorPart) (DatePart) (TitlePart) (SourcePart)\n - (series) A set of codes/guidelines in a series\n (AuthorPart) (DatePart) (SeriesTitlePart) (SourcePart)\n\n\nAuthorPart\n - Authors, Group Authors, Editors w/o Authors\n - Inverted names\n\nDatePart\n - Publication Date (Year)\n\nTitlePart\n - Title of the work (italics), Editors, format\n\nSeriesTitlePart\n - Title/Description of the work (italics), Series Title, Volume/Issue Number, Editors, format\n\nSourcePart\n - Publisher, DOI, URL\n\n*/\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let type = shared.getStringValue(refData.type);\n // let kind = shared.getStringValue(refData.kind);\n\n // if (type.length == 0 || kind.length == 0) {\n // return 'Type and Kind required.';\n // }\n\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n\n switch (type) {\n case 'whole':\n //(AuthorPart) (DatePart) (TitlePart) (SourcePart)\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n break;\n\n case 'series':\n //(AuthorPart) (DatePart) (SeriesTitlePart) (SourcePart)\n let seriesTitlePart = getSeriesTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = seriesTitlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + seriesTitlePart + ' ' + sourcePart;\n }\n break;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let workTitle = shared.getStringValue(refData.workTitle);\n\n if (workTitle.length > 0) {\n //remove our subtitle for the citation\n if (workTitle.includes(':')) {\n var array = workTitle.split(\":\");\n workTitle = array[0];\n }\n\n authorString = workTitle.toTitleCase().italicize(); \n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n //if there ia publication date original also, include it before the publication date\n let publicationDateOriginal = shared.getYear(refData.originalPublicationDate);\n \n if (publicationDateOriginal.length == 0 && (refData.type == 'reprinted')) {\n publicationDateOriginal = 'n.d.';\n }\n\n if (publicationDateOriginal.length > 0) {\n year = publicationDateOriginal + '/'+ year;\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n //Title of the work (italics), Editors, format\n let titlePart = '';\n\n let title = shared.getStringValue(refData.workTitle);\n \n if (title.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = title.italicize(); \n }\n\n //editors\n let editorArray = shared.getEditors(refData.contributors);\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n\n let authorArray = shared.getAuthors(refData.contributors);\n let description = shared.getStringValue(refData.description);\n\n //build our secondary contributors portion\n if ((editorString.length > 0 && authorArray.length > 0) ||\n description.length > 0) {\n \n var isFirstNames = true;\n\n titlePart = titlePart + ' (';\n\n if (editorString.length > 0 && authorArray.length > 0) {\n titlePart = titlePart + editorString;\n isFirstNames = false;\n }\n\n if (description.length > 0 && !isFirstNames) {\n titlePart = titlePart + ';';\n }\n\n if (description.length > 0) {\n if (!isFirstNames) {\n titlePart = titlePart + ' ';\n isFirstNames = false;\n }\n\n titlePart = titlePart + description;\n }\n\n titlePart = titlePart + ')';\n }\n\n //format\n let format = shared.getStringValue(refData.format);\n \n if (format.length > 0) {\n titlePart = titlePart + ' [' + format + ']';\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getSeriesTitlePart(refData){\n //- Title/Description of the work (italics), Series Title, Volume/Issue Number, Editors, format\n //em>Work title: Subtitle of the work (A. A. Editora, B. B. Editorb Jr., & C. C. Editorc, Eds.; Series Title, Publication No. 10-12345) [Format].\n let titlePart = '';\n\n let title = shared.getStringValue(refData.workTitle);\n \n if (title.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = title.italicize(); \n }\n\n //editors\n let editorArray = shared.getEditors(refData.contributors);\n let editorString = shared.getReferenceNameString(editorArray, true);\n let authorArray = shared.getAuthors(refData.contributors);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n let description = shared.getStringValue(refData.description)\n // let custom = shared.getStringValue(refData.custom);\n // let issue = shared.getStringValue(refData.issue);\n // let volume = shared.getStringValue(refData.volume);\n\n //build our secondary contributors portion\n if ((editorString.length > 0 && authorArray.length > 0) ||\n seriesTitle.length > 0 ||\n description.length > 0) {\n \n var isFirstNames = true;\n\n titlePart = titlePart + ' (';\n\n if (editorString.length > 0 && authorArray.length > 0) {\n titlePart = titlePart + editorString;\n isFirstNames = false;\n }\n\n if ((seriesTitle.length > 0 || \n description.length > 0) \n && !isFirstNames) {\n titlePart = titlePart + ';';\n }\n\n if (seriesTitle.length > 0) {\n if (!isFirstNames) {\n titlePart = titlePart + ' ';\n }\n\n isFirstNames = false;\n titlePart = titlePart + seriesTitle;\n }\n\n if (description.length > 0) {\n if (!isFirstNames) {\n if (seriesTitle.length > 0) {\n titlePart = titlePart + ', ';\n }\n else{\n titlePart = titlePart + ' ';\n }\n }\n\n isFirstNames = false;\n\n titlePart = titlePart + description;\n }\n\n titlePart = titlePart + ')';\n }\n\n //format\n let format = shared.getStringValue(refData.format);\n \n if (format.length > 0) {\n titlePart = titlePart + ' [' + format + ']';\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors, unless this is an entry\n if (editorArray.length > 0 && refData.type != 'entry') {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n //Publisher, DOI, URL\n let sourcePart = '';\n\n let publisherString = shared.getPublisherString(refData.publishers);\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n sourcePart = publisherString; \n } \n }\n\n if (doi.length > 0) {\n\n doi = shared.appendDOIURL(doi);\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + doi;\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n return sourcePart;\n}","/*\n*****InformalWorks*****\n \nDocumentation: https://docs.google.com/spreadsheets/d/14BXHp7D26CAiknsujdJHoyESUtMOAVc0BRwLMZcqiT0/edit#gid=2071428744\n\nType & Kind Questions\n - There aren't type/kind questions for informal works\n [Author Part] [Date Part] [Title Part] [Source Part]\n\nAuthorPart\n - Authors, Group Authors, Editors without authors\n\nDatePart\n - Year or n.d.\n\nTitlePart\n - Work title, Description in parentheses, Editors, description if no title\n\nSourcePart\n - Publisher/database/archive, doi, url\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n \n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n\n if (titlePart.length > 0) {\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + sourcePart;\n }\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.workTitle);\n title = shared.stripSubtitle(title);\n\n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n authorString = title.toTitleCase().italicize(); \n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n // - Work title, Description in parentheses, Editors, description if no title\n //Work title: Subtitle (A. A. Editora, B. B. Editorb Jr., & C. C. Editorc, Eds.; Description 12345).\n let titlePart = '';\n\n let title = shared.getStringValue(refData.workTitle);\n let authorArray = shared.getAuthors(refData.contributors);\n let editorArray = shared.getEditors(refData.contributors);\n \n //entry title has aleady been used if there aren't any authors\n if (title.length > 0 && (authorArray.length != 0 || editorArray.length != 0)) {\n if (title.startsWith('[')) {\n titlePart = title; \n }\n else{\n titlePart = title.italicize(); \n } \n }\n\n //editors\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n\n let description = shared.getStringValue(refData.description);\n\n //build our secondary contributors portion\n if ((editorString.length > 0 && authorArray.length > 0) ||\n description.length > 0) {\n \n var isFirstNames = true;\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '(';\n\n if (editorString.length > 0 && authorArray.length > 0) {\n titlePart = titlePart + editorString;\n isFirstNames = false;\n }\n\n if (description.length > 0) {\n if (isFirstNames) {\n titlePart = titlePart + description; \n }\n else{\n titlePart = titlePart + '; ' + description; \n }\n isFirstNames = false;\n }\n\n titlePart = titlePart + ')';\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors, unless this is an entry\n if (editorArray.length > 0) {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n if (authorPart.length == 0) {\n //use our title instead\n let title = shared.getStringValue(refData.workTitle);\n\n if (title.length > 0) {\n\n if (title.startsWith('[')) {\n authorPart = title;\n }\n else{\n authorPart = title.italicize(); \n }\n }\n }\n\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n // - Publisher/database/archive, doi, url\n //Publisher Name; Publisher Name 2; Publisher Name 3. https://doi.org/10.123456789\n let sourcePart = '';\n\n let publisherString = shared.getPublisherString(refData.publishers);\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n sourcePart = publisherString; \n } \n }\n\n if (doi.length > 0) {\n\n doi = shared.appendDOIURL(doi);\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + doi;\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n return sourcePart;\n}","/*\n*****Interview*****\n This was added after Turabian, and is based off of Personal Communications logic\n*/\n\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n\n let datePart = getDatePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let sourcePart = getSourcePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart ; \n }\n else{\n\n if (titlePart.length > 0) {\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n else{\n referenceValue = authorPart + ' ' + datePart;\n }\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: false,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData) {\n //this is it's own beast\n //(A. A. Authora, personal communication, April 1, 2019)\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n\n if (refData.type == 'archive') {\n if (item.type == 'editor') {\n authorArray.push(item);\n }\n }\n else{\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n }\n });\n\n let authorString = shared.getReverseCitationAuthorString(authorArray);\n let formattedDate = shared.getReverseFullDate(refData.publicationDate);\n\n //check to see if they have excluded the name or date part\n if (citationData.namePart == 'false') {\n authorString = '';\n }\n\n if (citationData.datePart == 'false') {\n formattedDate = '';\n }\n else{\n //if there is no year, use n.d.\n if (formattedDate.length == 0) {\n formattedDate = 'n.d.';\n }\n }\n\n let firstCitation = '';\n\n if (authorString.length > 0) {\n firstCitation = authorString + ', ';\n }\n\n firstCitation = firstCitation + 'personal communication';\n\n if (formattedDate.length > 0) {\n firstCitation = firstCitation + ', ' + formattedDate;\n }\n\n if (citationData.type == 'time') {\n let location = shared.getCitationLocationString(citationData);\n\n if (location.length > 0) {\n firstCitation = firstCitation + ', ' + location;\n }\n }\n\n let citation = {\n first : firstCitation,\n subsequent : ''\n }\n\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n let title = 'Personal communication';\n\n if (refData.type == 'archive') {\n let number = shared.getStringValue(refData.number);\n\n if (number.length > 0) {\n title = 'Personal communication (' + number + ')' ;\n }\n }\n\n let authorArray = shared.getAuthors(refData.contributors);\n\n if (refData.type == 'archive') {\n\n if (refData.kind == 'anonymous') {\n title = title + ' [Interview]';\n }\n else{\n if (authorArray.length > 0) {\n let authorString = '';\n \n authorArray.forEach(contributor => {\n \n let name = '';\n \n if (contributor.firstName && contributor.firstName.trim().length > 0) {\n name = contributor.firstName;\n }\n \n if (contributor.middleName && contributor.middleName.trim().length > 0) {\n name = name + ' ' + contributor.middleName.getInitial();\n }\n \n if (contributor.lastName && contributor.lastName.trim().length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n \n name = name + contributor.lastName.trim();\n }\n \n var suffix = '';\n if (contributor.suffix && contributor.suffix.trim().length > 0) {\n suffix = contributor.suffix.trim();\n }\n \n if (suffix.length > 0) {\n name = name + ' ' + suffix;\n \n if (!name.endsWith(\".\")) {\n name = name + '.'\n }\n }\n \n if (authorString.length > 0) {\n authorString = authorString + ', '\n }\n \n authorString = authorString + name;\n });\n \n if (authorString.length > 0) {\n title = title + ' [Interview with ' + authorString + ']'\n }\n else\n {\n title = title + '[Interview]';\n }\n }\n }\n\n titlePart = title + '.'; \n }\n else{\n if (title.length > 0 && (authorArray.length != 0)) {\n titlePart = title + ' [Interview].'; \n }\n }\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n \n let authorString = '';\n if (refData.type == 'archive') {\n let editorArray = shared.getContributorsByType('editor', refData.contributors);\n authorString = shared.getEditorsAtStartofRefString(editorArray);\n }\n else{\n let authorArray = shared.getAuthors(refData.contributors);\n authorString = shared.getReferenceNameString(authorArray, false);\n }\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n //use our title instead\n let title = 'Personal communication [Interview].';\n\n if (title.length > 0) {\n authorPart = title;\n }\n }\n\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n //Publishers\n let sourcePart = '';\n \n let publisherString = shared.getPublisherString(refData.publishers);\n \n if (publisherString != '.') {\n sourcePart = publisherString; \n }\n\n return sourcePart;\n}","/*\n*****JOURNAL*****\n\nDocumentation: https://docs.google.com/document/d/1FnauUXKWxIQazzVtds4ztAlWlPE4RtAPtsYvWlI3Qc8/edit\n\nType & Kind Question\n- Type (journal): Journal Article (Ex. 10.1-10.10)\n - Kind (article): A single published article\n - Kind (foreign): Foreign language or translated article\n - Kind (advance): Advance online publication\n - Kind (inPress): In-press article\n - Kind (editorial): Editorial\n[AuthorPart][DatePart][TitlePart][SourcePart]\n\n- Type (reprinted): Reprinted Article (Ex. 10.11)\n - Kind (article): A single article\n - Kind (foreign): Foreign language or translated article\n[AuthorPart][DatePart][TitlePart][Source Part][ReprintedSourcePart [OriginalArticleTitlePart][OriginalDatePart][OriginalJournalPart][OriginalSourcePart]]\n\n- Type (special): Special Issue or Section (Ex. 10.12)\n - Kind (issue): Entire special issue \n - Kind (section): Special section\n[AuthorPart][DatePart][SectionTitlePart][SourcePart]\n\n\nAuthorPart\n - Authors, Group Authors, Usernames, Editors\n\nDatePart\n - Publication Date: either \"YYYY\", \"YYYY, MM\", \"YYYY, MM DD\", \"n.d.\", or \"in-press\" (the YYYYMMDD will cover all other periodicals)\n\nTitlePart\n - Article Title, Translated Article Title, Journal Title, Translated Journal Title, Editors, Translators, Volume, Issue, Page or Article Numbers\n\nSourcePart\n - DOI or URL\n\nReprintedSourcePart (Reprinted article)\n - OriginalArticleTitlePart\n - \"(Reprinted from \", Original Article Title\n - OriginalDatePart\n - Original Publication Date: either \"YYYY\", \"YYYY, MM\", \"YYYY, MM DD\", or \"n.d.\"\n - OriginalJournalPart\n - Original Journal Title, Original Volume, Original Issue, Original Page or Article Numbers\n - OriginalSourcePart\n - Original DOI or URL\n\nSectionTitlePart (Special Section or Issue)\n - Section Title, Translated Section Title, \"[Special Section]\" or \"[Special Issue]\", Journal Title, Translated Journal Title, Editors, Translators, Volume, Issue, Page or Article Numbers (Section Only)\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0 || kind.length == 0) {\n return 'Type and Kind required.';\n }\n\n let authorPart = getAuthorPart(refData);\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n\n if (type == 'journal') {\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n let title = shared.getStringValue(refData.articleTitle);\n authorPart = title + '.';\n\n titlePart = titlePart.replace(authorPart + ' ', '');\n }\n\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n\n if (kind == 'retracted') {\n let retractedSourcePart = getRetractedSourcePart(refData);\n\n if (retractedSourcePart.length > 0) {\n referenceValue = referenceValue + ' ' + retractedSourcePart;\n }\n }\n }\n\n if (type == 'reprinted') {\n let titlePart = getTitlePart(refData);\n let reprintedSourcePart = getReprintedSourcePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart + ' ' + reprintedSourcePart;\n } else {\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart + ' ' + reprintedSourcePart;\n }\n }\n\n if (type == 'special') {\n let sectionTitlePart = getSectionTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors \n let label = '';\n let title = '';\n\n if (refData.kind == 'issue') {\n label = '[Special issue]';\n title = shared.getStringValue(refData.issueTitle);\n }\n\n if (refData.kind == 'section') {\n label = '[Special section]';\n title = shared.getStringValue(refData.sectionTitle);\n }\n\n authorPart = title + ' ' + label + '.';\n\n sectionTitlePart = sectionTitlePart.replace(authorPart + ' ', '');\n }\n\n referenceValue = authorPart + ' ' + datePart + ' ' + sectionTitlePart + ' ' + sourcePart;\n }\n\n if (type == 'database') {\n let titlePart = getDatabaseTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n let title = shared.getStringValue(refData.articleTitle);\n authorPart = title + '.';\n\n titlePart = titlePart.replace(authorPart + ' ', '');\n }\n\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n\n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n } else {\n\n let title = '';\n\n if (refData.kind == 'issue') {\n title = shared.getStringValue(refData.issueTitle);\n }\n\n if (refData.kind == 'section') {\n title = shared.getStringValue(refData.sectionTitle);\n }\n\n if (refData.type == 'journal' || refData.type == 'database') {\n title = shared.getStringValue(refData.articleTitle);\n }\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n authorString = title; \n }\n else{\n authorString = '\"' + title.toTitleCase() + ',\" '; \n } \n }\n }\n }\n\n if (refData.kind == 'inPress') {\n year = 'in press';\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n //if there ia publication date original also, include it before the publication date\n let publicationDateOriginal = shared.getYear(refData.originalPublicationDate);\n\n if (publicationDateOriginal.length == 0 && (refData.type == 'reprinted')) {\n publicationDateOriginal = 'n.d.';\n }\n\n if (publicationDateOriginal.length > 0) {\n year = publicationDateOriginal + '/' + year;\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getAuthorPart(refData) {\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray)\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors\n if (editorArray.length > 0) {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n } else {\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData) {\n\n if (refData.kind == 'inPress') {\n return '(in press).';\n }\n\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getTitlePart(refData) {\n let titlePart = '';\n\n let articleTitle = shared.getStringValue(refData.articleTitle);\n let translatedArticleTitle = shared.getStringValue(refData.translatedArticleTitle);\n let journalTitle = shared.getStringValue(refData.journalTitle);\n let volume = shared.getStringValue(refData.volume);\n let issue = shared.getStringValue(refData.issue);\n let referencePages = shared.getStringValue(refData.referencePages);\n let articleNumber = shared.getStringValue(refData.articleNumber);\n\n //editors\n let editorArray = shared.getEditors(refData.contributors);\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n } else {\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n\n //translators\n let translatorString = shared.getTranslatorString(refData.contributors);\n\n //editor and translator string\n //this is only the scenario where they all match and we don't need the individual string\n let editorTranslatorString = shared.getEditorTranslatorString(refData.contributors);\n\n if (editorTranslatorString.length > 0) {\n editorString = '';\n translatorString = '';\n }\n\n //build out the title part\n //Title of the article [Translated article title] (A. A. Editora, Ed.; A. A. Translatora, Trans.). Journal Title, 3(2), 13–21, 27.\n if (translatedArticleTitle.length > 0 && articleTitle.length == 0) {\n articleTitle = translatedArticleTitle;\n translatedArticleTitle = '';\n }\n\n if (articleTitle.length > 0) {\n\n let authorPart = getAuthorPart(refData);\n\n if (authorPart.length > 0) {\n titlePart = articleTitle; \n }\n }\n\n if (translatedArticleTitle.length > 0) {\n titlePart = titlePart + ' [' + translatedArticleTitle + ']';\n }\n\n let secondaryContribs = '';\n\n if (editorString.length > 0 ||\n translatorString.length > 0 ||\n editorTranslatorString.length > 0) {\n\n var isFirstNames = true;\n\n if (editorTranslatorString.length > 0) {\n secondaryContribs = editorTranslatorString;\n isFirstNames = false;\n }\n\n let authorArray = shared.getAuthors(refData.contributors);\n if (editorString.length > 0 && authorArray.length > 0) {\n secondaryContribs = editorString;\n isFirstNames = false;\n }\n\n if (translatorString.length > 0) {\n if (isFirstNames) {\n secondaryContribs = translatorString;\n } else {\n secondaryContribs = secondaryContribs + '; ' + translatorString;\n }\n isFirstNames = false;\n }\n\n if (secondaryContribs.length > 0) {\n titlePart = titlePart + ' (' + secondaryContribs + ')';\n }\n }\n\n if (refData.kind == 'editorial') {\n titlePart = titlePart + ' [Editorial]';\n }\n\n if (journalTitle.length > 0) {\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart) + ' ';\n }\n\n titlePart = titlePart + journalTitle.italicize();\n }\n\n if (volume.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ', ';\n }\n\n titlePart = titlePart + volume.italicize();\n }\n\n if (issue.length > 0) {\n if (volume.length == 0) {\n titlePart = titlePart + ', ';\n }\n\n titlePart = titlePart + '(' + issue + ')';\n }\n\n if (referencePages.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ', ';\n }\n\n referencePages = shared.fixPageDash(referencePages);\n\n titlePart = titlePart + referencePages;\n }\n\n if (articleNumber.length > 0 && referencePages.length == 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ', ';\n }\n\n titlePart = titlePart + 'Article ' + articleNumber;\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getDatabaseTitlePart(refData) {\n let titlePart = '';\n\n let articleTitle = shared.getStringValue(refData.articleTitle);\n let translatedArticleTitle = shared.getStringValue(refData.translatedArticleTitle);\n let journalTitle = shared.getStringValue(refData.journalTitle);\n let volume = shared.getStringValue(refData.volume);\n let issue = shared.getStringValue(refData.issue);\n let referencePages = shared.getStringValue(refData.referencePages);\n let articleNumber = shared.getStringValue(refData.articleNumber);\n let databaseTitle = shared.getStringValue(refData.databaseTitle);\n\n //editors\n let editorArray = shared.getEditors(refData.contributors);\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n } else {\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n\n //translators\n let translatorString = shared.getTranslatorString(refData.contributors);\n\n //editor and translator string\n //this is only the scenario where they all match and we don't need the individual string\n let editorTranslatorString = shared.getEditorTranslatorString(refData.contributors);\n\n if (editorTranslatorString.length > 0) {\n editorString = '';\n translatorString = '';\n }\n\n //build out the title part\n //Title of the article [Translated article title] (A. A. Editora, Ed.; A. A. Translatora, Trans.). Journal Title, 3(2), 13–21, 27.\n if (translatedArticleTitle.length > 0 && articleTitle.length == 0) {\n articleTitle = translatedArticleTitle;\n translatedArticleTitle = '';\n }\n\n if (articleTitle.length > 0) {\n titlePart = articleTitle;\n }\n\n if (translatedArticleTitle.length > 0) {\n titlePart = titlePart + ' [' + translatedArticleTitle + ']';\n }\n\n let secondaryContribs = '';\n\n if (editorString.length > 0 ||\n translatorString.length > 0 ||\n editorTranslatorString.length > 0) {\n\n var isFirstNames = true;\n\n if (editorTranslatorString.length > 0) {\n secondaryContribs = editorTranslatorString;\n isFirstNames = false;\n }\n\n let authorArray = shared.getAuthors(refData.contributors);\n if (editorString.length > 0 && authorArray.length > 0) {\n secondaryContribs = editorString;\n isFirstNames = false;\n }\n\n if (translatorString.length > 0) {\n if (isFirstNames) {\n secondaryContribs = translatorString;\n } else {\n secondaryContribs = secondaryContribs + '; ' + translatorString;\n }\n isFirstNames = false;\n }\n\n if (secondaryContribs.length > 0) {\n titlePart = titlePart + ' (' + secondaryContribs + ')';\n }\n }\n\n if (refData.kind == 'editorial') {\n titlePart = titlePart + ' [Editorial]';\n }\n\n if (databaseTitle.length == 0) {\n if (journalTitle.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + '. ';\n }\n\n titlePart = titlePart + journalTitle.italicize();\n }\n\n if (volume.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ', ';\n }\n\n titlePart = titlePart + volume.italicize();\n }\n\n if (issue.length > 0) {\n if (volume.length == 0) {\n titlePart = titlePart + ', ';\n }\n\n titlePart = titlePart + '(' + issue + ')';\n }\n\n if (referencePages.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ', ';\n }\n\n referencePages = shared.fixPageDash(referencePages);\n\n titlePart = titlePart + referencePages;\n }\n\n if (articleNumber.length > 0 && referencePages.length == 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ', ';\n }\n\n titlePart = titlePart + 'Article ' + articleNumber;\n }\n \n }\n\n if (databaseTitle.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + '. ';\n }\n\n titlePart = titlePart + databaseTitle.italicize();\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getSectionTitlePart(refData) {\n //Section Title, Translated Section Title, \"[Special Section]\" or \"[Special Issue]\", Journal Title, Translated Journal Title, Editors, Translators, Volume, Issue, Page or Article Numbers (Section Only)\n //Title of the section [Translated section title] (A. A. Translatora, & B. B. Translatorb, Jr., Trans.) [Special section]. Journal Title, 3(2), 13–21, 27.\n let sectionTitlePart = '';\n\n // \"sectionTitle\" : \"Title of the section\",\n // \"translatedSectionTitle\" : \"Translated section title\",\n // \"journalTitle\" : \"Journal Title\",\n // \"publicationDate\" : \"//2019\",\n // \"volume\" : \"3\",\n // \"issue\" : \"2\",\n // \"referencePages\" : \"13–21, 27\",\n // \"retrievalDate\" : \"5/15/2019\"\n\n let sectionTitle = shared.getStringValue(refData.sectionTitle);\n let translatedSectionTitle = shared.getStringValue(refData.translatedSectionTitle);\n let issueTitle = shared.getStringValue(refData.issueTitle);\n let translatedIssueTitle = shared.getStringValue(refData.translatedIssueTitle);\n let translatorString = shared.getTranslatorString(refData.contributors);\n let journalTitle = shared.getStringValue(refData.journalTitle);\n let volume = shared.getStringValue(refData.volume);\n let issue = shared.getStringValue(refData.issue);\n let referencePages = shared.getStringValue(refData.referencePages);\n\n //editors\n let editorArray = shared.getEditors(refData.contributors);\n let authorArray = shared.getAuthors(refData.contributors);\n let editorString = '';\n\n if (authorArray.length > 0) {\n editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n } else {\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n }\n\n if (refData.kind == 'section') {\n sectionTitlePart = sectionTitle;\n\n if (translatedSectionTitle.length) {\n if (sectionTitlePart.length > 0) {\n sectionTitlePart = sectionTitlePart + ' ';\n }\n\n sectionTitlePart = sectionTitlePart + '[' + translatedSectionTitle + ']';\n }\n }\n\n if (refData.kind == 'issue') {\n sectionTitlePart = issueTitle;\n\n if (translatedIssueTitle.length) {\n if (sectionTitlePart.length > 0) {\n sectionTitlePart = sectionTitlePart + ' ';\n }\n\n sectionTitlePart = sectionTitlePart + '[' + translatedIssueTitle + ']';\n }\n }\n\n if (translatorString.length > 0 || editorString.length > 0) {\n if (sectionTitlePart.length > 0) {\n sectionTitlePart = sectionTitlePart + ' ';\n }\n\n // sectionTitlePart = sectionTitlePart + '(' + translatorString + ')';\n sectionTitlePart = sectionTitlePart + '(';\n sectionTitlePart = sectionTitlePart + editorString;\n\n if (translatorString.length > 0 && editorString.length > 0) {\n sectionTitlePart = sectionTitlePart + '; ';\n }\n\n sectionTitlePart = sectionTitlePart + translatorString;\n sectionTitlePart = sectionTitlePart+ ')';\n }\n\n if (refData.kind == 'section') {\n sectionTitlePart = sectionTitlePart + ' [Special section].';\n }\n\n if (refData.kind == 'issue') {\n sectionTitlePart = sectionTitlePart + ' [Special issue].';\n }\n\n if (journalTitle.length > 0) {\n if (sectionTitlePart.length > 0) {\n sectionTitlePart = sectionTitlePart + ' ';\n }\n\n sectionTitlePart = sectionTitlePart + journalTitle.italicize();\n }\n\n if (volume.length > 0) {\n if (sectionTitlePart.length > 0) {\n sectionTitlePart = sectionTitlePart + ',';\n }\n\n sectionTitlePart = sectionTitlePart + ' ' + volume.italicize();\n }\n\n if (issue.length > 0) {\n sectionTitlePart = sectionTitlePart + '(' + issue + ')';\n }\n\n if (referencePages.length > 0) {\n sectionTitlePart = sectionTitlePart + ', ' + shared.fixPageDash(referencePages);\n }\n\n sectionTitlePart = shared.fixTitlePartClosure(sectionTitlePart);\n\n return sectionTitlePart;\n}\n\nfunction getSourcePart(refData) {\n //Retrieved May 15, 2019 from https://doi.org/10.123456789 (Original work published 1945)\n let sourcePart = '';\n\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n let doi = shared.getStringValue(refData.doi);\n let url = shared.getStringValue(refData.url);\n let originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n\n if (refData.kind == 'advance') {\n sourcePart = 'Advance online publication.';\n }\n\n if (retrievalDate.length > 0) {\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + 'Retrieved';\n sourcePart = sourcePart + ' ' + shared.formatRetrievalDate(retrievalDate);\n sourcePart = sourcePart + ', from';\n }\n\n if (doi.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + shared.appendDOIURL(doi);\n } else {\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n }\n\n if (originalPublicationDate.length > 0 && refData.type != 'reprinted') {\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n let publicationDateYear = shared.getYear(originalPublicationDate);\n sourcePart = sourcePart + '(Original work published ' + publicationDateYear + ')';\n\n }\n\n return sourcePart;\n}\n\nfunction getReprintedSourcePart(refData) {\n let reprintedSourcePart = '';\n //(Reprinted from “Original article title,” 1945, Original Journal Name, 3[2], 13–21, 27, https://doi.org/10.987654321)\n\n let originalArticleTitle = shared.getStringValue(refData.originalArticleTitle);\n let originalPublicationDate = shared.getYear(refData.originalPublicationDate);\n let originalJournalTitle = shared.getStringValue(refData.originalJournalTitle);\n let originalVolume = shared.getStringValue(refData.originalVolume);\n let originalIssue = shared.getStringValue(refData.originalIssue);\n let originalPages = shared.getStringValue(refData.originalPages);\n let originalDoi = shared.getStringValue(refData.originalDoi);\n let originalUrl = shared.getStringValue(refData.originalUrl);\n\n //build the part\n reprintedSourcePart = '(Reprinted from';\n\n if (originalArticleTitle.length > 0) {\n reprintedSourcePart = reprintedSourcePart + ' \"' + originalArticleTitle + ',\"';\n }\n\n if (originalPublicationDate.length > 0) {\n reprintedSourcePart = reprintedSourcePart + ' ' + originalPublicationDate;\n }\n\n if (originalJournalTitle.length > 0) {\n if (!reprintedSourcePart.endsWith(',') || !reprintedSourcePart.endsWith(',\"')) {\n reprintedSourcePart = reprintedSourcePart + \",\";\n }\n\n reprintedSourcePart = reprintedSourcePart + ' ' + originalJournalTitle.italicize();\n }\n\n if (originalVolume.length > 0) {\n if (!reprintedSourcePart.endsWith(',') || !reprintedSourcePart.endsWith(',\"')) {\n reprintedSourcePart = reprintedSourcePart + \", \";\n }\n\n reprintedSourcePart = reprintedSourcePart + originalVolume.italicize();\n }\n\n if (originalIssue.length > 0) {\n reprintedSourcePart = reprintedSourcePart + '[' + originalIssue + ']';\n }\n\n if (originalPages.length > 0) {\n if (!reprintedSourcePart.endsWith(',') || !reprintedSourcePart.endsWith(',\"')) {\n reprintedSourcePart = reprintedSourcePart + \", \";\n }\n\n reprintedSourcePart = reprintedSourcePart + shared.fixPageDash(originalPages);\n }\n\n if (originalDoi.length > 0) {\n if (!reprintedSourcePart.endsWith(',') || !reprintedSourcePart.endsWith(',\"')) {\n reprintedSourcePart = reprintedSourcePart + \", \";\n }\n\n reprintedSourcePart = reprintedSourcePart + shared.appendDOIURL(originalDoi);\n } else {\n if (originalUrl.length > 0) {\n if (!reprintedSourcePart.endsWith(',') || !reprintedSourcePart.endsWith(',\"')) {\n reprintedSourcePart = reprintedSourcePart + \",\";\n }\n\n originalUrl = shared.formatURL(originalUrl);\n reprintedSourcePart = reprintedSourcePart + ' ' + originalUrl;\n }\n }\n\n reprintedSourcePart = reprintedSourcePart + ')';\n\n return reprintedSourcePart;\n}\n\nfunction getRetractedSourcePart(refData) {\n //(Retraction published April 1, 2018, Journal Title, 2[3], 12–13, https://www.perrla.com/retraction)\n let retractedSourcePart = '';\n let retractionDate = shared.getStringValue(refData.retractionDate);\n let retractionJournal = shared.getStringValue(refData.journalTitle);\n let retractionVolume = shared.getStringValue(refData.retractionVolume);\n let retractionIssue = shared.getStringValue(refData.retractionIssue);\n let retractionPages = shared.getStringValue(refData.retractionPages);\n let retractionURL = shared.getStringValue(refData.retractionURL);\n let retractionDOI = shared.getStringValue(refData.retractionDOI);\n let retractionArticleNumber = shared.getStringValue(refData.retractionArticleNumber);\n\n if (retractionDate.length > 0) {\n retractedSourcePart = retractedSourcePart + shared.getReverseFullDate(retractionDate);\n }\n\n if (retractionJournal.length > 0) {\n\n if (retractedSourcePart.length > 0) {\n retractedSourcePart = retractedSourcePart + ', ';\n }\n \n retractedSourcePart = retractedSourcePart + retractionJournal.italicize();\n }\n\n if (retractionVolume.length > 0) {\n if (!retractedSourcePart.endsWith(',') || !retractedSourcePart.endsWith(',\"')) {\n retractedSourcePart = retractedSourcePart + \", \";\n }\n\n retractedSourcePart = retractedSourcePart + retractionVolume.italicize();\n }\n\n if (retractionIssue.length > 0) {\n\n if (retractionVolume.length == 0) {\n retractedSourcePart = retractedSourcePart + \", \";\n }\n\n retractedSourcePart = retractedSourcePart + '[' + retractionIssue + ']';\n }\n\n if (retractionPages.length > 0) {\n if (!retractedSourcePart.endsWith(',') || !retractedSourcePart.endsWith(',\"')) {\n retractedSourcePart = retractedSourcePart + \", \";\n }\n\n retractedSourcePart = retractedSourcePart + shared.fixPageDash(retractionPages);\n }\n\n if (retractionArticleNumber.length > 0) {\n if (!retractedSourcePart.endsWith(',') || !retractedSourcePart.endsWith(',\"')) {\n retractedSourcePart = retractedSourcePart + \", \";\n }\n\n if (!retractionArticleNumber.startsWith('Article')) {\n retractionArticleNumber = \"Article \" + retractionArticleNumber\n }\n\n retractedSourcePart = retractedSourcePart + retractionArticleNumber;\n }\n\n if (retractionDOI.length > 0) {\n if (!retractedSourcePart.endsWith(',') || !retractedSourcePart.endsWith(',\"')) {\n retractedSourcePart = retractedSourcePart + \", \";\n }\n\n retractedSourcePart = retractedSourcePart + shared.appendDOIURL(retractionDOI);\n } else {\n if (retractionURL.length > 0) {\n if (!retractedSourcePart.endsWith(',') || !retractedSourcePart.endsWith(',\"')) {\n retractedSourcePart = retractedSourcePart + \",\";\n }\n\n retractionURL = shared.formatURL(retractionURL);\n retractedSourcePart = retractedSourcePart + ' ' + retractionURL;\n }\n }\n\n if (retractedSourcePart.length > 0) {\n retractedSourcePart = '(Retraction published ' + retractedSourcePart + ')';\n }\n\n return retractedSourcePart;\n}","/*\n*****Lectures*****\n \nFORM: https://docs.google.com/spreadsheets/d/1LrM8r8MnR33LtVuhPX4Erg8kMue8BEXF1v3JzA-jpoo/edit#gid=2071428744\nMOCKUP: https://magical-design-system.webflow.io/add-in/wizard/wizard-2-lecture-presentation-notes\n\nNO TYPE & KIND\n\n[contributors]. ([publicationDate]). [title] [[format]]. [publisher.reference]. [url]\n\nAuthorPart\n contributor.author\n - Normal author\n contributor.groupAuthor\n - Normal Group Author\n title\n - include if no contributors\n - don't italicize if a description\n - if a description, don't include format in brackets title\n\nDatePart\n publicationDate\n - Normal date for YYYY, MM DD\n - Include whatever's available\n\nTitlePart\n title\n - italicize\n - if a description, don't italicize & don't include format afterwards\n format\n - description of the content\n - place in brackets\n\nSourcePart\n publisher.reference\n - only ever a single field\n url\n - normal url\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let referenceValue = '';\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.title);\n title = shared.stripSubtitle(title);\n\n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n authorString = title.toTitleCase().italicize(); \n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n else{\n year = shared.fixPageDash(year);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0) {\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n let format = shared.getStringValue(refData.format);\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n titlePart = title;\n }\n else{\n titlePart = title.italicize();\n }\n }\n\n if (format.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[' + format + ']';\n }\n\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart);\n }\n\n return titlePart;\n}\n\nfunction getSourcePart(refData){\n let sourcePart = '';\n\n let url = shared.getStringValue(refData.url);\n let publisherString = shared.getPublisherString(refData.publishers);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n sourcePart = publisherString; \n } \n }\n \n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}","/*\n*****MAGAZINE*****\n\nDocumentation:\n\nType & Kind Question\n- Type (magazine): Magazine Article (Ex. 10.15)\n - Kind (article): A single article\n - Kind (foreign): Foreign language or translated article\n - Kind (editorial): An editorial\n[AuthorPart][DatePart][TitlePart][SourcePart]\n\n- Type (reprinted): Reprinted Article (Ex. 10.11)\n - Kind (article): A reprinted single article\n - Kind (foreign): Foreign language or translated article\n - Kind (editorial): A reprinted editorial\n[AuthorPart][DatePart][TitlePart][Source Part][ReprintedSourcePart [OriginalArticleTitlePart][OriginalDatePart][OriginalMagazinePart][OriginalSourcePart]]\n\n- Type (special): Special Issue or Section (Ex. 10.12)\n - Kind (issue): Entire special issue \n - Kind (section): Special section\n[AuthorPart][DatePart][SectionTitlePart][SourcePart]\n\n\nAuthorPart\n - Authors, Group Authors, Usernames, Editors\n\nDatePart\n - Publication Date: either \"YYYY\", \"YYYY, MM\", \"YYYY, MM DD\", or \"n.d.\"\n\nTitlePart\n - Article Title, Translated Article Title, Magazine Title, Translated Magazine Title, Editors, Translators, Volume, Issue, Page or Article Numbers\n\nSourcePart\n - DOI or URL\n\nReprintedSourcePart (Reprinted article)\n - OriginalArticleTitlePart\n - \"(Reprinted from \", Original Article Title\n - OriginalDatePart\n - Original Publication Date: either \"YYYY\", \"YYYY, MM\", \"YYYY, MM DD\", or \"n.d.\" – Date should include as much as given\n - OriginalMagazinePart\n - Original Magazine Title, Original Volume, Original Issue, Original Page or Article Numbers\n - OriginalSourcePart\n - Original DOI or URL\n\nSectionTitlePart (Special Section or Issue)\n - Section Title, Translated Section Title, \"[Special Section]\" or \"[Special Issue]\", Magazine Title, Translated Magazine Title, Editors, Translators, Volume, Issue, Page or Article Numbers (Section Only)\n\n*******CHANGES FROM JOURNAL**********\nThe main change from journal is that magazines should have a more speciic date, including month and year (sometimes day).\n\nMagazine also exchanges \"in press\" and \"advance online publication\" for \"editorials\". Editorials just add \"[editorial]\" as the format after the article title (like book).\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference (refData){\n\n let referenceValue = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0 || kind.length == 0) {\n return 'Type and Kind required.';\n }\n\n let authorPart = getAuthorPart(refData);\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n\n if (type == 'magazine') {\n let titlePart = getTitlePart(refData); \n\n if (authorPart.length == 0) {\n //no contributors\n let title = shared.getStringValue(refData.articleTitle);\n \n if (refData.kind == 'editorial') {\n title = title + ' [Editorial]';\n }\n\n authorPart = title + '.';\n\n titlePart = titlePart.replace(authorPart + ' ', '');\n }\n\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n\n if (kind == 'retracted') {\n let retractedSourcePart = getRetractedSourcePart(refData);\n\n if (retractedSourcePart.length > 0) {\n referenceValue = referenceValue + ' ' + retractedSourcePart;\n }\n }\n }\n\n if (type == 'reprinted'){\n let titlePart = getTitlePart(refData); \n let reprintedSourcePart = getReprintedSourcePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart + ' ' + reprintedSourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart + ' ' + reprintedSourcePart;\n } \n }\n\n if (type == 'special'){\n let sectionTitlePart = getSectionTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors \n let label = '';\n let title = '';\n\n if (refData.kind == 'issue') {\n label = '[Special issue]';\n title = shared.getStringValue(refData.issueTitle);\n }\n\n if (refData.kind == 'section') {\n label = '[Special section]';\n title = shared.getStringValue(refData.sectionTitle);\n }\n\n authorPart = title + ' ' + label + '.';\n\n sectionTitlePart = sectionTitlePart.replace(authorPart + ' ', '');\n }\n\n referenceValue = authorPart + ' ' + datePart + ' ' + sectionTitlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value : referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n \n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs){\n\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n if (refData.kind == 'issue') {\n authorString = '\"' + refData.issueTitle.toTitleCase() + ',\" ';\n }\n\n if (refData.kind == 'section') {\n authorString = '\"' + refData.sectionTitle.toTitleCase()+ ',\" ';\n }\n\n if (refData.type == 'magazine') {\n authorString = '\"' + refData.articleTitle.toTitleCase()+ ',\" ';\n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n //if there ia publication date original also, include it before the publication date\n let publicationDateOriginal = shared.getYear(refData.originalPublicationDate);\n \n if (publicationDateOriginal.length == 0 && (refData.type == 'reprinted')) {\n publicationDateOriginal = 'n.d.';\n }\n\n if (publicationDateOriginal.length > 0) {\n year = publicationDateOriginal + '/'+ year;\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray)\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors\n if (editorArray.length > 0) {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData) {\n\n if (refData.kind == 'inPress') {\n return '(in press).';\n }\n\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n \n let articleTitle = shared.getStringValue(refData.articleTitle);\n let translatedArticleTitle = shared.getStringValue(refData.translatedArticleTitle);\n let magazineTitle = shared.getStringValue(refData.magazineTitle);\n let volume = shared.getStringValue(refData.volume);\n let issue = shared.getStringValue(refData.issue);\n let referencePages = shared.getStringValue(refData.referencePages);\n let articleNumber = shared.getStringValue(refData.articleNumber);\n\n //editors\n let editorArray = shared.getEditors(refData.contributors);\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n\n //translators\n let translatorString = shared.getTranslatorString(refData.contributors);\n\n //editor and translator string\n //this is only the scenario where they all match and we don't need the individual string\n let editorTranslatorString = shared.getEditorTranslatorString(refData.contributors);\n\n if (editorTranslatorString.length >0) {\n editorString = '';\n translatorString = '';\n }\n\n //build out the title part\n //Title of the article [Translated article title] (A. A. Editora, Ed.; A. A. Translatora, Trans.). Magazine Title, 3(2), 13–21, 27.\n if (translatedArticleTitle.length > 0 && articleTitle.length == 0) {\n articleTitle = translatedArticleTitle;\n translatedArticleTitle = '';\n }\n \n if (articleTitle.length > 0) {\n titlePart = articleTitle;\n }\n\n if (translatedArticleTitle.length > 0) {\n titlePart = titlePart + ' [' + translatedArticleTitle + ']';\n }\n\n let secondaryContribs = '';\n\n if (editorString.length > 0 ||\n translatorString.length > 0 ||\n editorTranslatorString.length > 0) {\n \n var isFirstNames = true;\n\n if (editorTranslatorString.length > 0) {\n secondaryContribs = editorTranslatorString;\n isFirstNames = false;\n }\n\n let authorArray = shared.getAuthors(refData.contributors);\n if (editorString.length > 0 && authorArray.length > 0) {\n secondaryContribs = editorString;\n isFirstNames = false;\n }\n\n if (translatorString.length > 0) {\n if (isFirstNames) {\n secondaryContribs = translatorString; \n }\n else{\n secondaryContribs = secondaryContribs + '; ' + translatorString; \n }\n isFirstNames = false;\n }\n\n if (secondaryContribs.length > 0) {\n titlePart = titlePart + ' (' + secondaryContribs + ')';\n }\n }\n\n if (refData.kind == 'editorial') {\n titlePart = titlePart + ' [Editorial]';\n }\n\n if (magazineTitle.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + '. ';\n }\n\n titlePart = titlePart + magazineTitle.italicize();\n }\n\n if (volume.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ', ';\n }\n\n titlePart = titlePart + volume.italicize(); \n }\n\n if (issue.length > 0) {\n if (volume.length == 0) {\n titlePart = titlePart + ', ';\n }\n\n titlePart = titlePart + '(' + issue + ')';\n }\n\n if (referencePages.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ', ';\n }\n\n referencePages = shared.fixPageDash(referencePages);\n\n titlePart = titlePart + referencePages;\n }\n\n if (articleNumber.length > 0 && referencePages.length == 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ', ';\n }\n\n titlePart = titlePart + 'Article ' + articleNumber;\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getSectionTitlePart(refData){\n //Section Title, Translated Section Title, \"[Special Section]\" or \"[Special Issue]\", Magazine Title, Translated Magazine Title, Editors, Translators, Volume, Issue, Page or Article Numbers (Section Only)\n //Title of the section [Translated section title] (A. A. Translatora, & B. B. Translatorb, Jr., Trans.) [Special section]. Magazine Title, 3(2), 13–21, 27.\n let sectionTitlePart = '';\n\n // \"sectionTitle\" : \"Title of the section\",\n // \"translatedSectionTitle\" : \"Translated section title\",\n // \"magazineTitle\" : \"Magazine Title\",\n // \"publicationDate\" : \"//2019\",\n // \"volume\" : \"3\",\n // \"issue\" : \"2\",\n // \"referencePages\" : \"13–21, 27\",\n // \"retrievalDate\" : \"5/15/2019\"\n\n let sectionTitle = shared.getStringValue(refData.sectionTitle);\n let translatedSectionTitle = shared.getStringValue(refData.translatedSectionTitle);\n let issueTitle = shared.getStringValue(refData.issueTitle);\n let translatedIssueTitle = shared.getStringValue(refData.translatedIssueTitle);\n let translatorString = shared.getTranslatorString(refData.contributors);\n let magazineTitle = shared.getStringValue(refData.magazineTitle);\n let volume = shared.getStringValue(refData.volume);\n let issue = shared.getStringValue(refData.issue);\n let referencePages = shared.getStringValue(refData.referencePages);\n\n if (refData.kind == 'section') {\n sectionTitlePart = sectionTitle;\n\n if (translatedSectionTitle.length) {\n if (sectionTitlePart.length > 0) {\n sectionTitlePart = sectionTitlePart + ' ';\n } \n\n sectionTitlePart = sectionTitlePart + '[' + translatedSectionTitle + ']';\n } \n }\n\n if (refData.kind == 'issue') {\n sectionTitlePart = issueTitle;\n\n if (translatedIssueTitle.length) {\n if (sectionTitlePart.length > 0) {\n sectionTitlePart = sectionTitlePart + ' ';\n } \n\n sectionTitlePart = sectionTitlePart + '[' + translatedIssueTitle + ']';\n } \n }\n\n if (translatorString.length > 0) {\n if (sectionTitlePart.length > 0) {\n sectionTitlePart = sectionTitlePart + ' ';\n } \n\n sectionTitlePart = sectionTitlePart + '(' + translatorString + ')';\n }\n\n if (refData.kind == 'section') {\n sectionTitlePart = sectionTitlePart + ' [Special section].'; \n }\n\n if (refData.kind == 'issue') {\n sectionTitlePart = sectionTitlePart + ' [Special issue].'; \n }\n \n if (magazineTitle.length > 0) {\n if (sectionTitlePart.length > 0) {\n sectionTitlePart = sectionTitlePart + ' ';\n }\n\n sectionTitlePart = sectionTitlePart + magazineTitle.italicize();\n }\n\n if (volume.length > 0) {\n if (sectionTitlePart.length > 0) {\n sectionTitlePart = sectionTitlePart + ',';\n }\n\n sectionTitlePart = sectionTitlePart + ' ' + volume.italicize();\n }\n\n if (issue.length > 0) {\n sectionTitlePart = sectionTitlePart + '(' + issue + ')';\n }\n\n if (referencePages.length > 0) {\n sectionTitlePart = sectionTitlePart + ', ' + shared.fixPageDash(referencePages);\n }\n\n sectionTitlePart = shared.fixTitlePartClosure(sectionTitlePart);\n\n return sectionTitlePart;\n}\n\nfunction getSourcePart(refData){\n //Retrieved May 15, 2019 from https://doi.org/10.123456789 (Original work published 1945)\n let sourcePart = '';\n\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n let doi = shared.getStringValue(refData.doi);\n let url = shared.getStringValue(refData.url);\n let originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n \n if (refData.kind == 'advance') {\n sourcePart = 'Advance online publication.';\n }\n\n if (retrievalDate.length > 0) {\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + 'Retrieved';\n sourcePart = sourcePart + ' ' + shared.formatRetrievalDate(retrievalDate); \n sourcePart = sourcePart + ', from' ;\n }\n\n if (doi.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + shared.appendDOIURL(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n if (originalPublicationDate.length > 0 && refData.type != 'reprinted') {\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n let originalPublicationDateFormatted = shared.getFullDate(originalPublicationDate);\n sourcePart = sourcePart + '(Original work published ' + originalPublicationDateFormatted + ')';\n\n }\n\n return sourcePart;\n}\n\nfunction getReprintedSourcePart(refData){\n let reprintedSourcePart = '';\n //(Reprinted from “Original article title,” 1945, Original Magazine Name, 3[2], 13–21, 27, https://doi.org/10.987654321)\n\n let originalArticleTitle = shared.getStringValue(refData.originalArticleTitle);\n let originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n let originalMagazineTitle = shared.getStringValue(refData.originalMagazineTitle);\n let originalVolume = shared.getStringValue(refData.originalVolume);\n let originalIssue = shared.getStringValue(refData.originalIssue);\n let originalPages = shared.getStringValue(refData.originalPages);\n let originalDoi = shared.getStringValue(refData.originalDoi);\n let originalUrl = shared.getStringValue(refData.originalUrl);\n\n //build the part\n reprintedSourcePart = '(Reprinted from';\n\n if (originalArticleTitle.length > 0) {\n reprintedSourcePart = reprintedSourcePart + ' \"' + originalArticleTitle + ',\"';\n }\n\n if (originalPublicationDate.length > 0) {\n let originalPublicationDateFormatted = shared.getFullDate(originalPublicationDate);\n reprintedSourcePart = reprintedSourcePart + ' ' + originalPublicationDateFormatted;\n }\n\n if (originalMagazineTitle.length > 0) {\n if (!reprintedSourcePart.endsWith(',') || !reprintedSourcePart.endsWith(',\"')) {\n reprintedSourcePart = reprintedSourcePart + \",\";\n }\n\n reprintedSourcePart = reprintedSourcePart + ' ' + originalMagazineTitle.italicize();\n }\n\n if (originalVolume.length > 0) {\n if (!reprintedSourcePart.endsWith(',') || !reprintedSourcePart.endsWith(',\"')) {\n reprintedSourcePart = reprintedSourcePart + \", \";\n }\n\n reprintedSourcePart = reprintedSourcePart + originalVolume.italicize();\n }\n\n if (originalIssue.length > 0) {\n reprintedSourcePart = reprintedSourcePart + '[' + originalIssue + ']';\n }\n\n if (originalPages.length > 0) {\n if (!reprintedSourcePart.endsWith(',') || !reprintedSourcePart.endsWith(',\"')) {\n reprintedSourcePart = reprintedSourcePart + \", \";\n }\n\n reprintedSourcePart = reprintedSourcePart + shared.fixPageDash(originalPages);\n }\n\n if (originalDoi.length > 0) {\n if (!reprintedSourcePart.endsWith(',') || !reprintedSourcePart.endsWith(',\"')) {\n reprintedSourcePart = reprintedSourcePart + \", \";\n }\n\n reprintedSourcePart = reprintedSourcePart + shared.appendDOIURL(originalDoi);\n }\n else{\n if (originalUrl.length > 0) {\n if (!reprintedSourcePart.endsWith(',') || !reprintedSourcePart.endsWith(',\"')) {\n reprintedSourcePart = reprintedSourcePart + \",\";\n }\n\n originalUrl = shared.formatURL(originalUrl);\n reprintedSourcePart = reprintedSourcePart + ' ' + originalUrl;\n }\n }\n\n reprintedSourcePart = reprintedSourcePart + ')';\n\n return reprintedSourcePart;\n}\n\nfunction getRetractedSourcePart(refData) {\n //(Retraction published April 1, 2018, Magazine Title 2, 2[3], 12–13, https://www.perrla.com/retraction)\"\n let retractedSourcePart = '';\n let retractionDate = shared.getStringValue(refData.retractionDate);\n let retractionMagazine = shared.getStringValue(refData.retractionMagazine);\n let retractionVolume = shared.getStringValue(refData.retractionVolume);\n let retractionIssue = shared.getStringValue(refData.retractionIssue);\n let retractionPages = shared.getStringValue(refData.retractionPages);\n let retractionURL = shared.getStringValue(refData.retractionURL);\n let retractionDOI = shared.getStringValue(refData.retractionDOI);\n let retractionArticleNumber = shared.getStringValue(refData.retractionArticleNumber);\n\n if (retractionDate.length > 0) {\n retractedSourcePart = retractedSourcePart + shared.getReverseFullDate(retractionDate);\n }\n\n if (retractionMagazine.length > 0) {\n\n if (retractedSourcePart.length > 0) {\n retractedSourcePart = retractedSourcePart + ', ';\n }\n \n retractedSourcePart = retractedSourcePart + retractionMagazine.italicize();\n }\n\n if (retractionVolume.length > 0) {\n if (!retractedSourcePart.endsWith(',') || !retractedSourcePart.endsWith(',\"')) {\n retractedSourcePart = retractedSourcePart + \", \";\n }\n\n retractedSourcePart = retractedSourcePart + retractionVolume.italicize();\n }\n\n if (retractionIssue.length > 0) {\n\n if (retractionVolume.length == 0) {\n retractedSourcePart = retractedSourcePart + \", \";\n }\n\n retractedSourcePart = retractedSourcePart + '[' + retractionIssue + ']';\n }\n\n if (retractionPages.length > 0) {\n if (!retractedSourcePart.endsWith(',') || !retractedSourcePart.endsWith(',\"')) {\n retractedSourcePart = retractedSourcePart + \", \";\n }\n\n retractedSourcePart = retractedSourcePart + shared.fixPageDash(retractionPages);\n }\n\n if (retractionArticleNumber.length > 0) {\n if (!retractedSourcePart.endsWith(',') || !retractedSourcePart.endsWith(',\"')) {\n retractedSourcePart = retractedSourcePart + \", \";\n }\n\n if (!retractionArticleNumber.startsWith('Article')) {\n retractionArticleNumber = \"Article \" + retractionArticleNumber\n }\n\n retractedSourcePart = retractedSourcePart + retractionArticleNumber;\n }\n\n if (retractionDOI.length > 0) {\n if (!retractedSourcePart.endsWith(',') || !retractedSourcePart.endsWith(',\"')) {\n retractedSourcePart = retractedSourcePart + \", \";\n }\n\n retractedSourcePart = retractedSourcePart + shared.appendDOIURL(retractionDOI);\n } else {\n if (retractionURL.length > 0) {\n if (!retractedSourcePart.endsWith(',') || !retractedSourcePart.endsWith(',\"')) {\n retractedSourcePart = retractedSourcePart + \",\";\n }\n\n retractionURL = shared.formatURL(retractionURL);\n retractedSourcePart = retractedSourcePart + ' ' + retractionURL;\n }\n }\n\n if (retractedSourcePart.length > 0) {\n retractedSourcePart = '(Retraction published ' + retractedSourcePart + ')';\n }\n\n return retractedSourcePart;\n}","/*\n*****Manuscript*****\n \nDocumentation: TODO: Include a link to the Google Document for this type here\n\nType & Kind Questions\n- TODO: Document the type and kinds for thi type\n\nTODO: Document the parts and their fields here\nAuthorPart\n - TODO: Fields for this part here\n\nDatePart\n - TODO: Fields for this part here\n\nTitlePart\n - TODO: Fields for this part here\n\nSourcePart\n - TODO: Fields for this part here\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n \n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.workTitle);\n title = shared.stripSubtitle(title);\n\n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n authorString = title.toTitleCase().italicize(); \n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n //Manuscript title: Subtitle (A. A. Editora, B. B. Editorb Jr., & C. C. Editorc, Eds.) [Unpublished manuscript].\n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.workTitle);\n\n if (workTitle.length > 0) {\n if (workTitle.startsWith('[')) {\n titlePart = workTitle; \n }\n else{\n titlePart = workTitle.italicize(); \n }\n }\n\n let editorArray = shared.getEditors(refData.contributors);\n \n //if there is not author, we need to check editors, unless this is an entry\n if (editorArray.length > 0) {\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n let editorLabel = 'Ed.';\n\n if (editorArray.length > 1) {\n editorLabel = 'Eds.';\n }\n\n\n editorString = '(' + editorString + ', ' + editorLabel + ')';\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + editorString;\n }\n\n let manuscriptLabel = '';\n switch (refData.type) {\n case 'unpublished':\n manuscriptLabel = '[Unpublished manuscript]';\n break;\n case 'preparation':\n manuscriptLabel = '[Manuscript in preparation]';\n break;\n case 'submitted':\n manuscriptLabel = '[Manuscript submitted for publication]';\n break;\n }\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + manuscriptLabel;\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors, unless this is an entry\n if (editorArray.length > 0 && refData.type != 'entry') {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n if (authorPart.length == 0) {\n //use our title instead\n let title = shared.getStringValue(refData.entryTitle);\n\n if (title.length > 0) {\n\n if (!title.endsWith('.')) {\n title = title + '.';\n }\n \n authorPart = title; \n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n // Department of Cryptozoology, PERRLA University. https://doi.org/10.123456789\n let sourcePart = '';\n\n let publisherString = shared.getPublisherString(refData.publishers);\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n sourcePart = publisherString; \n } \n }\n\n if (doi.length > 0) {\n\n doi = shared.appendDOIURL(doi);\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + doi;\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n return sourcePart;\n\n return sourcePart;\n}","/*\n*****Music*****\n \nDocumentation: TODO: Include a link to the Google Document for this type here\n\nType & Kind Questions\n- Types:\n - \"album\" : A whole album or stand-alone piece\n - \"song\" : A song or track on an album\n\nTODO: Document the parts and their fields here\nAuthorPart\n - Author, Group Author, Album title (if no artist & album), Song title (if no artist & song)\n\nDatePart\n - publicationDate\n\nTitlePart\n - Album name (if album), Song name (if song), \"[Album]\" (if album), \"[Song]\" (if song), \"; recorded by\" (if a cover, added into Format brackets)\n\nSourcePart\n \"On \" Album Name (if a song), Label Names, \"(Original work published ####)\" (if a cover)\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n \n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n //referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart;\n //for this type, our data part is split into the middle title part\n referenceValue = titlePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = '';\n let songTitle = shared.getStringValue(refData.songTitle);\n let albumTitle = shared.getStringValue(refData.albumTitle);\n\n if (songTitle.length > 0) {\n title = songTitle;\n }\n else{\n if (albumTitle.length > 0) {\n title = albumTitle;\n }\n }\n\n if (title.length > 0) {\n title = shared.stripSubtitle(title);\n\n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n if (songTitle.length > 0) {\n authorString = title; \n }\n else{\n authorString = title.toTitleCase().italicize(); \n } \n } \n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n else{\n year = shared.fixPageDash(year);\n }\n\n //if there ia publication date original also, include it before the publication date\n let publicationDateOriginal = shared.getYear(refData.originalPublicationDate);\n \n if (publicationDateOriginal.length == 0) {\n publicationDateOriginal = 'n.d.';\n\n if (refData.kind == 'cover') {\n year = publicationDateOriginal + '/'+ year; \n }\n }\n else{\n year = publicationDateOriginal + '/'+ year;\n }\n\n if (citationData.type == 'time') {\n citationData.value = shared.fixTimeCitationData(citationData.value);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let albumTitle = shared.getStringValue(refData.albumTitle);\n let songTitle = shared.getStringValue(refData.songTitle);\n let format = shared.getStringValue(refData.format);\n let groupPerformerString = shared.getGroupPerformerString(refData.contributors);\n let performerArray = shared.getPerformers(refData.contributors);\n let performerString = shared.getReferenceNameString(performerArray, true);\n let authorPart = getAuthorPart(refData);\n\n if (refData.type == 'album') {\n //Album name [Album recorded by Group Performer Name; Special version].\n if (albumTitle.length > 0) {\n titlePart = albumTitle.italicize() + ' ';\n\n titlePart = titlePart + '[Album';\n\n if (groupPerformerString.length > 0) {\n titlePart = titlePart + ' recorded by ' + groupPerformerString;\n }\n\n if (format.length > 0) {\n titlePart = titlePart + '; ' + format;\n }\n\n titlePart = titlePart + ']';\n }\n else{\n if (songTitle.length > 0) {\n titlePart = songTitle + ' ';\n\n titlePart = titlePart + '[Song';\n\n if (performerString.length > 0) {\n titlePart = titlePart + ' recorded by ' + performerString;\n }\n\n if (groupPerformerString.length > 0) {\n titlePart = titlePart + ' recorded by ' + groupPerformerString;\n }\n\n if (format.length > 0) {\n titlePart = titlePart + '; ' + format;\n }\n\n titlePart = titlePart + ']';\n }\n }\n\n //if we don't have an author part, we need to throw the date part in here instead\n if (authorPart.length == 0) {\n let datePart = getDatePart(refData);\n datePart = datePart.substring(0, datePart.length - 1);\n\n titlePart = titlePart + '. ' + datePart;\n }\n }\n\n if (refData.type == 'song') {\n //Song title [Song; Special version]. On Album name.\n if (songTitle.length > 0) {\n titlePart = songTitle + ' ';\n\n titlePart = titlePart + '[Song';\n\n if (performerString.length > 0) {\n titlePart = titlePart + ' recorded by ' + performerString;\n }\n\n if (groupPerformerString.length > 0) {\n titlePart = titlePart + ' recorded by ' + groupPerformerString;\n }\n\n if (format.length > 0) {\n titlePart = titlePart + '; ' + format;\n }\n\n titlePart = titlePart + ']';\n\n //if we don't have an author part, we need to throw the date part in here instead\n if (authorPart.length == 0) {\n let datePart = getDatePart(refData);\n datePart = datePart.substring(0, datePart.length - 1);\n\n titlePart = titlePart + '. ' + datePart;\n }\n\n if (albumTitle.length > 0) {\n titlePart = titlePart + '. On '\n\n if (!albumTitle.startsWith('[')) {\n albumTitle = albumTitle.italicize();\n }\n\n titlePart = titlePart + albumTitle;\n }\n }\n else{\n //this is weird, but if they selected a song, but didnt enter the song and only entered the album\n if (albumTitle.length > 0) {\n titlePart = albumTitle.italicize() + ' ';\n }\n \n titlePart = titlePart + '[Album';\n \n if (groupPerformerString.length > 0) {\n titlePart = titlePart + ' recorded by ' + groupPerformerString;\n }\n \n if (format.length > 0) {\n titlePart = titlePart + '; ' + format;\n }\n \n titlePart = titlePart + ']';\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n //we'd need to append the date part here, odd odd case\n let datePart = getDatePart(refData);\n\n titlePart = titlePart + ' ' + datePart;\n }\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors, unless this is an entry\n if (editorArray.length > 0 && refData.type != 'entry') {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n if (authorPart.length == 0) {\n //use our title instead\n let title = shared.getStringValue(refData.entryTitle);\n\n if (title.length > 0) {\n\n if (!title.endsWith('.')) {\n title = title + '.';\n }\n \n authorPart = title; \n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + shared.fixPageDash(formattedDate) + ').';\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n // Museum Name, Washington, D.C., United States.\n let sourcePart = '';\n\n let publisherString = shared.getPublisherString(refData.publishers);\n let city = shared.getStringValue(refData.city);\n let state = shared.getStringValue(refData.state);\n let country = shared.getStringValue(refData.country);\n let url = shared.getStringValue(refData.url);\n let publicationDateOriginal = shared.getYear(refData.originalPublicationDate);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n //remove our period for this one....we'll add it back later if needed\n sourcePart = publisherString.substring(0, publisherString.length -1); \n } \n }\n\n if (city.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', '\n }\n\n sourcePart = sourcePart + city;\n }\n\n if (state.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', '\n }\n\n sourcePart = sourcePart + state;\n }\n\n if (country.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', '\n }\n\n sourcePart = sourcePart + country;\n }\n\n if (sourcePart.length > 0) {\n if (!sourcePart.endsWith('.')) {\n sourcePart = sourcePart + '.';\n }\n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' '\n }\n\n sourcePart = sourcePart + url;\n }\n\n if (publicationDateOriginal.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' '\n }\n\n sourcePart = sourcePart + '(Original work published ' + publicationDateOriginal + ')';\n }\n else{\n //f this is a cover and they didn't enter the date....n.d.\n if (refData.kind == 'cover') {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' '\n }\n \n sourcePart = sourcePart + '(Original work published n.d.)';\n }\n }\n\n return sourcePart;\n}","/*\n*****NEWSPAPER*****\n\nDocumentation:\n\nType & Kind Question\n- Type (newspaper): Newspaper Article (Ex. 10.15)\n - Kind (article): A single article\n - Kind (foreign): Foreign language or translated article\n - Kind (editorial): An editorial article\n[AuthorPart][DatePart][TitlePart][SourcePart]\n\n- Type (reprinted): Reprinted Article (Ex. 10.11)\n - Kind (article): A single article\n - Kind (foreign): Foreign language or translated article\n - Kind (editorial): A reprinted editorial \n[AuthorPart][DatePart][TitlePart][Source Part][ReprintedSourcePart [OriginalArticleTitlePart][OriginalDatePart][OriginalNewspaperPart][OriginalSourcePart]]\n\n- Type (special): Special Issue or Section (Ex. 10.12)\n - Kind (issue): Entire special issue \n - Kind (section): Special section\n[AuthorPart][DatePart][SectionTitlePart][SourcePart]\n\n\nAuthorPart\n - Authors, Group Authors, Editors\n\nDatePart\n - Publication Date: either \"YYYY\", \"YYYY, MM\", \"YYYY, MM DD\", or \"n.d.\"\n\nTitlePart\n - Article Title, Translated Article Title, Translators, \"[Editorial]\", Newspaper Title, Translated Newspaper Title, Editors, Page Numbers\n\nSourcePart\n - URL\n\nReprintedSourcePart (Reprinted article)\n - OriginalArticleTitlePart\n - \"(Reprinted from \", Original Article Title\n - OriginalDatePart\n - Original Publication Date: either \"YYYY\", \"YYYY, MM\", \"YYYY, MM DD\", or \"n.d.\" – Date should include as much as given\n - OriginalNewspaperPart\n - Original Newspaper Title, Original Page Numbers\n - OriginalSourcePart\n - Original URL\n\nSectionTitlePart (Special Section or Issue)\n - Section Title, Translated Section Title, \"[Special Section]\" or \"[Special Issue]\", Newspaper Title, Translated Newspaper Title, Editors, Translators, Page Numbers (Section Only)\n\n*******CHANGES FROM JOURNAL**********\nThe main change from journal is that newspapers should have a speciic date, including year, month, and day.\n\nMagazine also exchanges \"in press\" and \"advance online publication\" for \"editorials\". Editorials just add \"[editorial]\" as the format after the article title (like book).\n\n */\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference (refData){\n\n let referenceValue = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0 || kind.length == 0) {\n return 'Type and Kind required.';\n }\n\n let authorPart = getAuthorPart(refData);\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n\n if (type == 'newspaper') {\n let titlePart = getTitlePart(refData); \n\n if (authorPart.length == 0) {\n //no contributors\n let title = shared.getStringValue(refData.articleTitle);\n\n if (refData.kind == 'editorial') {\n title = title + ' [Editorial]';\n }\n\n authorPart = title + '.';\n\n titlePart = titlePart.replace(authorPart + ' ', '');\n }\n\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n\n if (kind == 'retracted') {\n let retractedSourcePart = getRetractedSourcePart(refData);\n\n if (retractedSourcePart.length > 0) {\n referenceValue = referenceValue + ' ' + retractedSourcePart;\n }\n }\n }\n\n if (type == 'reprinted'){\n let titlePart = getTitlePart(refData); \n let reprintedSourcePart = getReprintedSourcePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart + ' ' + reprintedSourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart + ' ' + reprintedSourcePart;\n } \n }\n\n if (type == 'special'){\n let sectionTitlePart = getSectionTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors \n let label = '';\n let title = '';\n\n if (refData.kind == 'issue') {\n label = '[Special issue]';\n title = shared.getStringValue(refData.issueTitle);\n }\n\n if (refData.kind == 'section') {\n label = '[Special section]';\n title = shared.getStringValue(refData.sectionTitle);\n }\n\n authorPart = title + ' ' + label + '.';\n\n sectionTitlePart = sectionTitlePart.replace(authorPart + ' ', '');\n }\n\n referenceValue = authorPart + ' ' + datePart + ' ' + sectionTitlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value : referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n \n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs){\n\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n if (refData.kind == 'issue') {\n authorString = refData.issueTitle.toTitleCase();\n }\n\n if (refData.kind == 'section') {\n authorString = refData.sectionTitle.toTitleCase();\n }\n\n if (refData.type == 'newspaper') {\n authorString = refData.articleTitle.toTitleCase(); \n }\n }\n }\n\n if (refData.kind == 'inPress') {\n year = 'in press';\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n //if there ia publication date original also, include it before the publication date\n let publicationDateOriginal = shared.getYear(refData.originalPublicationDate);\n \n if (publicationDateOriginal.length == 0 && (refData.type == 'reprinted')) {\n publicationDateOriginal = 'n.d.';\n }\n\n if (publicationDateOriginal.length > 0) {\n year = publicationDateOriginal + '/'+ year;\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray)\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors\n if (editorArray.length > 0) {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n\n if (refData.kind == 'inPress') {\n return '(in press).'; \n }\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n \n let articleTitle = shared.getStringValue(refData.articleTitle);\n let translatedArticleTitle = shared.getStringValue(refData.translatedArticleTitle);\n let newspaperTitle = shared.getStringValue(refData.newspaperTitle);\n let volume = shared.getStringValue(refData.volume);\n let issue = shared.getStringValue(refData.issue);\n let referencePages = shared.getStringValue(refData.referencePages);\n let articleNumber = shared.getStringValue(refData.articleNumber);\n\n //editors\n let editorArray = shared.getEditors(refData.contributors);\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n\n //translators\n let translatorString = shared.getTranslatorString(refData.contributors);\n\n //editor and translator string\n //this is only the scenario where they all match and we don't need the individual string\n let editorTranslatorString = shared.getEditorTranslatorString(refData.contributors);\n\n if (editorTranslatorString.length >0) {\n editorString = '';\n translatorString = '';\n }\n\n //build out the title part\n //Title of the article [Translated article title] (A. A. Editora, Ed.; A. A. Translatora, Trans.). Newspaper Title, 3(2), 13–21, 27.\n if (translatedArticleTitle.length > 0 && articleTitle.length == 0) {\n articleTitle = translatedArticleTitle;\n translatedArticleTitle = '';\n }\n \n if (articleTitle.length > 0) {\n titlePart = articleTitle;\n }\n\n if (translatedArticleTitle.length > 0) {\n titlePart = titlePart + ' [' + translatedArticleTitle + ']';\n }\n\n let secondaryContribs = '';\n\n if (editorString.length > 0 ||\n translatorString.length > 0 ||\n editorTranslatorString.length > 0) {\n \n var isFirstNames = true;\n\n if (editorTranslatorString.length > 0) {\n secondaryContribs = editorTranslatorString;\n isFirstNames = false;\n }\n\n let authorArray = shared.getAuthors(refData.contributors);\n if (editorString.length > 0 && authorArray.length > 0) {\n secondaryContribs = editorString;\n isFirstNames = false;\n }\n\n if (translatorString.length > 0) {\n if (isFirstNames) {\n secondaryContribs = translatorString; \n }\n else{\n secondaryContribs = secondaryContribs + '; ' + translatorString; \n }\n isFirstNames = false;\n }\n\n if (secondaryContribs.length > 0) {\n titlePart = titlePart + ' (' + secondaryContribs + ')';\n }\n }\n\n if (refData.kind == 'editorial') {\n titlePart = titlePart + ' [Editorial]';\n }\n\n if (newspaperTitle.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + '. ';\n }\n\n titlePart = titlePart + newspaperTitle.italicize();\n }\n\n if (volume.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ', ';\n }\n\n titlePart = titlePart + volume.italicize(); \n }\n\n if (issue.length > 0) {\n if (volume.length == 0) {\n titlePart = titlePart + ', ';\n }\n\n titlePart = titlePart + '(' + issue + ')';\n }\n\n if (referencePages.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ', ';\n }\n\n referencePages = shared.fixPageDash(referencePages);\n\n titlePart = titlePart + referencePages;\n }\n\n if (articleNumber.length > 0 && referencePages.length == 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ', ';\n }\n\n titlePart = titlePart + 'Article ' + articleNumber;\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getSectionTitlePart(refData){\n //Section Title, Translated Section Title, \"[Special Section]\" or \"[Special Issue]\", Newspaper Title, Translated Newspaper Title, Editors, Translators, Volume, Issue, Page or Article Numbers (Section Only)\n //Title of the section [Translated section title] (A. A. Translatora, & B. B. Translatorb, Jr., Trans.) [Special section]. Newspaper Title, 3(2), 13–21, 27.\n let sectionTitlePart = '';\n\n // \"sectionTitle\" : \"Title of the section\",\n // \"translatedSectionTitle\" : \"Translated section title\",\n // \"newspaperTitle\" : \"Newspaper Title\",\n // \"publicationDate\" : \"//2019\",\n // \"volume\" : \"3\",\n // \"issue\" : \"2\",\n // \"referencePages\" : \"13–21, 27\",\n // \"retrievalDate\" : \"5/15/2019\"\n\n let sectionTitle = shared.getStringValue(refData.sectionTitle);\n let translatedSectionTitle = shared.getStringValue(refData.translatedSectionTitle);\n let issueTitle = shared.getStringValue(refData.issueTitle);\n let translatedIssueTitle = shared.getStringValue(refData.translatedIssueTitle);\n let translatorString = shared.getTranslatorString(refData.contributors);\n let newspaperTitle = shared.getStringValue(refData.newspaperTitle);\n let volume = shared.getStringValue(refData.volume);\n let issue = shared.getStringValue(refData.issue);\n let referencePages = shared.getStringValue(refData.referencePages);\n\n if (refData.kind == 'section') {\n sectionTitlePart = sectionTitle;\n\n if (translatedSectionTitle.length) {\n if (sectionTitlePart.length > 0) {\n sectionTitlePart = sectionTitlePart + ' ';\n } \n\n sectionTitlePart = sectionTitlePart + '[' + translatedSectionTitle + ']';\n } \n }\n\n if (refData.kind == 'issue') {\n sectionTitlePart = issueTitle;\n\n if (translatedIssueTitle.length) {\n if (sectionTitlePart.length > 0) {\n sectionTitlePart = sectionTitlePart + ' ';\n } \n\n sectionTitlePart = sectionTitlePart + '[' + translatedIssueTitle + ']';\n } \n }\n\n if (translatorString.length > 0) {\n if (sectionTitlePart.length > 0) {\n sectionTitlePart = sectionTitlePart + ' ';\n } \n\n sectionTitlePart = sectionTitlePart + '(' + translatorString + ')';\n }\n\n if (refData.kind == 'section') {\n sectionTitlePart = sectionTitlePart + ' [Special section].'; \n }\n\n if (refData.kind == 'issue') {\n sectionTitlePart = sectionTitlePart + ' [Special issue].'; \n }\n \n if (newspaperTitle.length > 0) {\n if (sectionTitlePart.length > 0) {\n sectionTitlePart = sectionTitlePart + ' ';\n }\n\n sectionTitlePart = sectionTitlePart + newspaperTitle.italicize();\n }\n\n if (volume.length > 0) {\n if (sectionTitlePart.length > 0) {\n sectionTitlePart = sectionTitlePart + ',';\n }\n\n sectionTitlePart = sectionTitlePart + ' ' + volume.italicize();\n }\n\n if (issue.length > 0) {\n sectionTitlePart = sectionTitlePart + '(' + issue + ')';\n }\n\n if (referencePages.length > 0) {\n sectionTitlePart = sectionTitlePart + ', ' + shared.fixPageDash(referencePages);\n }\n\n sectionTitlePart = shared.fixTitlePartClosure(sectionTitlePart);\n\n return sectionTitlePart;\n}\n\nfunction getSourcePart(refData){\n //Retrieved May 15, 2019 from https://doi.org/10.123456789 (Original work published 1945)\n let sourcePart = '';\n\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n let doi = shared.getStringValue(refData.doi);\n let url = shared.getStringValue(refData.url);\n let originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n \n if (refData.kind == 'advance') {\n sourcePart = 'Advance online publication.';\n }\n\n if (retrievalDate.length > 0) {\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + 'Retrieved';\n sourcePart = sourcePart + ' ' + shared.formatRetrievalDate(retrievalDate); \n sourcePart = sourcePart + ', from' ;\n }\n\n if (doi.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + shared.appendDOIURL(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n if (originalPublicationDate.length > 0 && refData.type != 'reprinted') {\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n let originalPublicationDateFormatted = shared.getFullDate(originalPublicationDate);\n sourcePart = sourcePart + '(Original work published ' + originalPublicationDateFormatted + ')';\n\n }\n\n return sourcePart;\n}\n\nfunction getReprintedSourcePart(refData){\n let reprintedSourcePart = '';\n //(Reprinted from “Original article title,” 1945, Original Newspaper Name, 3[2], 13–21, 27, https://doi.org/10.987654321)\n\n let originalArticleTitle = shared.getStringValue(refData.originalArticleTitle);\n let originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n let originalNewspaperTitle = shared.getStringValue(refData.originalNewspaperTitle);\n let originalVolume = shared.getStringValue(refData.originalVolume);\n let originalIssue = shared.getStringValue(refData.originalIssue);\n let originalPages = shared.getStringValue(refData.originalPages);\n let originalDoi = shared.getStringValue(refData.originalDoi);\n let originalUrl = shared.getStringValue(refData.originalUrl);\n\n //build the part\n reprintedSourcePart = '(Reprinted from';\n\n if (originalArticleTitle.length > 0) {\n reprintedSourcePart = reprintedSourcePart + ' \"' + originalArticleTitle + ',\"';\n }\n\n if (originalPublicationDate.length > 0) {\n let originalPublicationDateFormatted = shared.getFullDate(originalPublicationDate);\n reprintedSourcePart = reprintedSourcePart + ' ' + originalPublicationDateFormatted;\n }\n\n if (originalNewspaperTitle.length > 0) {\n if (!reprintedSourcePart.endsWith(',') || !reprintedSourcePart.endsWith(',\"')) {\n reprintedSourcePart = reprintedSourcePart + \",\";\n }\n\n reprintedSourcePart = reprintedSourcePart + ' ' + originalNewspaperTitle.italicize();\n }\n\n if (originalVolume.length > 0) {\n if (!reprintedSourcePart.endsWith(',') || !reprintedSourcePart.endsWith(',\"')) {\n reprintedSourcePart = reprintedSourcePart + \", \";\n }\n\n reprintedSourcePart = reprintedSourcePart + originalVolume.italicize();\n }\n\n if (originalIssue.length > 0) {\n reprintedSourcePart = reprintedSourcePart + '[' + originalIssue + ']';\n }\n\n if (originalPages.length > 0) {\n if (!reprintedSourcePart.endsWith(',') || !reprintedSourcePart.endsWith(',\"')) {\n reprintedSourcePart = reprintedSourcePart + \", \";\n }\n\n reprintedSourcePart = reprintedSourcePart + shared.fixPageDash(originalPages);\n }\n\n if (originalDoi.length > 0) {\n if (!reprintedSourcePart.endsWith(',') || !reprintedSourcePart.endsWith(',\"')) {\n reprintedSourcePart = reprintedSourcePart + \", \";\n }\n\n reprintedSourcePart = reprintedSourcePart + shared.appendDOIURL(originalDoi);\n }\n else{\n if (originalUrl.length > 0) {\n if (!reprintedSourcePart.endsWith(',') || !reprintedSourcePart.endsWith(',\"')) {\n reprintedSourcePart = reprintedSourcePart + \",\";\n }\n\n originalUrl = shared.formatURL(originalUrl);\n reprintedSourcePart = reprintedSourcePart + ' ' + originalUrl;\n }\n }\n\n reprintedSourcePart = reprintedSourcePart + ')';\n\n return reprintedSourcePart;\n}\n\nfunction getRetractedSourcePart(refData) {\n //(Retraction published April 1, 2018, Newspaper Title, 2[3], A12–A13, https://www.perrla.com/retraction)\n let retractedSourcePart = '';\n let retractionDate = shared.getStringValue(refData.retractionDate);\n let retractionTitle = shared.getStringValue(refData.newspaperTitle);\n let retractionVolume = shared.getStringValue(refData.retractionVolume);\n let retractionIssue = shared.getStringValue(refData.retractionIssue);\n let retractionPages = shared.getStringValue(refData.retractionPages);\n let retractionURL = shared.getStringValue(refData.retractionURL);\n let retractionDOI = shared.getStringValue(refData.retractionDOI);\n let retractionArticleNumber = shared.getStringValue(refData.retractionArticleNumber);\n\n if (retractionDate.length > 0) {\n retractedSourcePart = retractedSourcePart + shared.getReverseFullDate(retractionDate);\n }\n\n if (retractionTitle.length > 0) {\n\n if (retractedSourcePart.length > 0) {\n retractedSourcePart = retractedSourcePart + ', ';\n }\n \n retractedSourcePart = retractedSourcePart + retractionTitle.italicize();\n }\n\n if (retractionVolume.length > 0) {\n if (!retractedSourcePart.endsWith(',') || !retractedSourcePart.endsWith(',\"')) {\n retractedSourcePart = retractedSourcePart + \", \";\n }\n\n retractedSourcePart = retractedSourcePart + retractionVolume.italicize();\n }\n\n if (retractionIssue.length > 0) {\n\n if (retractionVolume.length == 0) {\n retractedSourcePart = retractedSourcePart + \", \";\n }\n\n retractedSourcePart = retractedSourcePart + '[' + retractionIssue + ']';\n }\n\n if (retractionPages.length > 0) {\n if (!retractedSourcePart.endsWith(',') || !retractedSourcePart.endsWith(',\"')) {\n retractedSourcePart = retractedSourcePart + \", \";\n }\n\n retractedSourcePart = retractedSourcePart + shared.fixPageDash(retractionPages);\n }\n\n if (retractionArticleNumber.length > 0) {\n if (!retractedSourcePart.endsWith(',') || !retractedSourcePart.endsWith(',\"')) {\n retractedSourcePart = retractedSourcePart + \", \";\n }\n\n if (!retractionArticleNumber.startsWith('Article')) {\n retractionArticleNumber = \"Article \" + retractionArticleNumber\n }\n\n retractedSourcePart = retractedSourcePart + retractionArticleNumber;\n }\n\n if (retractionDOI.length > 0) {\n if (!retractedSourcePart.endsWith(',') || !retractedSourcePart.endsWith(',\"')) {\n retractedSourcePart = retractedSourcePart + \", \";\n }\n\n retractedSourcePart = retractedSourcePart + shared.appendDOIURL(retractionDOI);\n } else {\n if (retractionURL.length > 0) {\n if (!retractedSourcePart.endsWith(',') || !retractedSourcePart.endsWith(',\"')) {\n retractedSourcePart = retractedSourcePart + \",\";\n }\n\n retractionURL = shared.formatURL(retractionURL);\n retractedSourcePart = retractedSourcePart + ' ' + retractionURL;\n }\n }\n\n if (retractedSourcePart.length > 0) {\n retractedSourcePart = '(Retraction published ' + retractedSourcePart + ')';\n }\n\n return retractedSourcePart;\n}","/*\n*****OnlineComment*****\n \nMOCKUP: https://magical-design-system.webflow.io/add-in/wizard/wizard-2-online-comment\nFORM: https://docs.google.com/spreadsheets/d/1dsP2E0humU09xEJDU0X08JyBovcf5oKuya-CZmmYJKI/edit#gid=1084144617\n\nTYPES:\n forum\n - This is an exact copy of Forum from Social Media\n [contributors]. ([pubicationDate]). [content] [Online forum post]. [platform]. [url]\n comment\n - A comment on an article or webpage\n article: [contributors]. ([publicationDate]). [content] [Comment on the article \"[title]\"]. [source]. [url] ***the brackets around \"Comment on the...\" aren't fields like [title]\n page: [contributors]. ([publicationDate]). [content] [Comment on the webpage \"[title]\"]. [source]. [url]\n\nKINDS:\n comment has two kinds: article & page\n - the only difference between them is the inserted text\n \"[Comment on the article...]\" vs. \"[Comment on the webpage...]\"\n\nAuthorPart\n contributors\n - username: Same as normal\n - groupAuthors: These now include a username field\n content\n - if there are no contributors, start with [content]\n\nDatePart\n publicationDate\n - Normal. Uses MM/DD/YY. Leave out any missing parts.\n - Uses n.d. when empty.\n\nTitlePart\n content\n - this is the first 20 words of the comment\n platform\n - forum type only\n - the name of the platform where the content was made\n title\n - comment type only\n - title of the page where the comment was made\n\nSourcePart\n source\n - comment type only\n - name of the source of the page where the comment was made (pseudo publisher, but doesn't act like it)\n url\n - the url for the page where the comment was made\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n let type = shared.getStringValue(refData.type);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.content);\n\n if (title.length > 0) {\n //trim this to the first five words\n let titleArray = title.split(' ');\n if(titleArray.length > 0){\n let i = 0;\n\n while (i < 5) {\n if (authorString.length > 0) {\n authorString = authorString + ' ';\n }\n\n authorString = authorString + titleArray[i];\n i++;\n }\n\n authorString = authorString;\n }\n else{\n authorString = title;\n }\n \n if (type == 'forum') {\n authorString = authorString.italicize();\n }\n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n else{\n year = shared.fixPageDash(year);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let content = shared.getStringValue(refData.content);\n let title = shared.getStringValue(refData.title);\n\n if (content.length > 0) {\n\n content = shared.limitWordsInString(content, 20);\n\n if (type == 'forum') {\n titlePart = content.italicize(); \n }\n else{\n titlePart = content;\n }\n }\n\n let label = '';\n\n switch (type) {\n case 'forum':\n label = '[Online forum post]';\n break;\n case 'comment':\n\n if (title.length > 0) {\n if (kind == 'article') {\n label = \"[Comment on the article '\" + title + \"']\";\n }\n \n if (kind == 'webpage') {\n label = \"[Comment on the webpage '\" + title + \"']\";\n } \n }\n \n break;\n }\n\n if (label.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + label;\n }\n\n \n\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart);\n }\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0) {\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n let sourcePart = '';\n let platform = shared.getStringValue(refData.platform);\n let source = shared.getStringValue(refData.source);\n let url = shared.getStringValue(refData.url);\n\n if (platform.length > 0) {\n sourcePart = platform + '.';\n }\n\n if (source.length > 0) {\n sourcePart = source.italicize() + '.';\n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}","/*\n*****Patent*****\n \nFORM: https://docs.google.com/spreadsheets/d/12c6R7-SaPK8oB43iUDUGdr8vLDghHsiPnltMDo5fhHU/edit#gid=2071428744\nMOCKUP: https://magical-design-system.webflow.io/add-in/wizard/wizard-2-patent\n\nTYPE & KIND\n - None\n\n[contributors]. ([publicationDate]). [title] (U.S. Patent No. [number]). U.S. Patent and Trademark Office. [url]\n\nAuthorPart\n contributor.author\n contributor.groupAuthor\n - Normal\n title\n - if there aren't contributors\n\nDatePart\n publicationDate\n - YYYY\n\nTitlePart\n title\n - Italicize title\n number\n - follows title\n - always includes \"(U.S. Patent No. \" before the number and \").\" after it\n - Place number exactly as it is typed by the user\n\nSourcePart\n Preset text\n - Always includes \"U.S. Patent and Trademark Office\"\n url\n - Normal\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let referenceValue = '';\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n // referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart;\n referenceValue = titlePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.title);\n title = shared.stripSubtitle(title);\n\n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n authorString = title.toTitleCase().italicize(); \n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n else{\n year = shared.fixPageDash(year);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0) {\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getYear(publicationDate);\n\n if (formattedDate.length == 0) {\n formattedDate = 'n.d.';\n }\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n let number = shared.getStringValue(refData.number);\n\n let authorPart = getAuthorPart(refData);\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n titlePart = title;\n }\n else{\n titlePart = title.italicize();\n }\n }\n\n //if we don't have an author, put the date here\n if (authorPart.length == 0) {\n let datePart = getDatePart(refData);\n\n if (datePart.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + '. ';\n }\n\n titlePart = titlePart + datePart;\n }\n }\n\n if (number.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '(U.S. Patent No. ' + number + ')';\n }\n\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart);\n }\n\n return titlePart;\n}\n\nfunction getSourcePart(refData){\n let url = shared.getStringValue(refData.url);\n\n let sourcePart = 'U.S. Patent and Trademark Office.';\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}","/*\n*****PersonalCommunication*****\n\n- This type is not printed on the reference page, so whatever we spit out here is just for \"decoration\"\n \n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n\n let datePart = getDatePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart ; \n }\n else{\n\n if (titlePart.length > 0) {\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart;\n }\n else{\n referenceValue = authorPart + ' ' + datePart;\n }\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: false,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData) {\n //this is it's own beast\n //(A. A. Authora, personal communication, April 1, 2019)\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getReverseCitationAuthorString(authorArray);\n let formattedDate = shared.getReverseFullDate(refData.publicationDate);\n\n //check to see if they have excluded the name or date part\n if (citationData.namePart == 'false') {\n authorString = '';\n }\n\n if (citationData.datePart == 'false') {\n formattedDate = '';\n }\n else{\n //if there is no year, use n.d.\n if (formattedDate.length == 0) {\n formattedDate = 'n.d.';\n }\n }\n\n let firstCitation = '';\n\n if (authorString.length > 0) {\n firstCitation = authorString + ', ';\n }\n\n firstCitation = firstCitation + 'personal communication';\n\n if (formattedDate.length > 0) {\n firstCitation = firstCitation + ', ' + formattedDate;\n }\n\n let citation = {\n first : firstCitation,\n subsequent : ''\n }\n\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n let title = 'Personal communication.';\n let authorArray = shared.getAuthors(refData.contributors);\n\n if (title.length > 0 && (authorArray.length != 0)) {\n titlePart = title; \n }\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n //use our title instead\n let title = 'Personal communication.';\n\n if (title.length > 0) {\n authorPart = title;\n }\n }\n\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}","/*\n*****PodcastsRadio*****\n \nDocumentation: https://docs.google.com/spreadsheets/d/16xG-DW-rxA7KBPQGk0fTFwXr3O5B72oiK4F-fcCwroQ/edit#gid=2071428744\n\nType & Kind Questions\n- TYPE: \n - episode: A podcast or radio episode\n - series: An entire podcast or radio series\n - interview: A radio interview in a digital archive (no Kind options)\n\n- KIND:\n - audio: An audio podcast\n - video: A video podcast\n - radio: A radio broadcast\n\nAuthorPart\n - Contributors\n - Host(s)\n - Executive Producer(s)\n - Interviewee(s)\n - Last, F. M. (role)\n\nDatePart\n - Series \n - ([publicationDate]).\n - A year or range of years\n - The second year can be \"present\"\n - Years should be separated by a – (en dash) without spaces\n - Episode\n - ([publicationDate]).\n - This is a specific date with YYYY, MM DD\nTitlePart\n - Episode\n - [episodeTitle] ([episodeNumber]). [format]\n - Episode title not italicized\n - Followed by the episode number in parentheses\n - That is followed by the format in brackets (this is set by the type/kind)\n - Ends with a period\n - Series\n - [title] [format]\n - Series title is italicized\n - Followed by the format in brackets (this is set by the type/kind)\n - Ends with a period\n - Interview\n - [title] [format]\n - Interview title is italicized\n - Followed by the format in brackets (this is set by the type/kind)\n - Ends with a period\n\nSourcePart\n - Episode\n - \"In \" [contributors.producer], [title]. [publishers.reference]. [url]\n - Series\n - [publishers.reference]. [url]\n - Interview\n - [archiveName]; [publishers.reference]. [url]\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0) {\n return 'Type required.';\n }\n\n let datePart = getDatePart(refData);\n let sourcePart = '';\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (refData.type == 'series' || refData.type == 'interview') {\n sourcePart = getSourcePart(refData);\n }\n\n if (refData.type == 'episode') {\n sourcePart = getEpisodeSourcePart(refData);\n }\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n\n if (refData.type == 'series') {\n if (item.type == 'host' || item.type == 'executiveProducer' || item.type == 'interview') {\n authorArray.push(item);\n } \n }\n\n if (refData.type == 'episode') {\n if (item.type == 'host') {\n authorArray.push(item);\n } \n }\n\n if (refData.type == 'interview') {\n if (item.type == 'interview') {\n authorArray.push(item);\n } \n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n let title = shared.getStringValue(refData.title);\n let episodeTitle = shared.getStringValue(refData.episodeTitle);\n let usingEpisodeTitle = false;\n\n if (refData.type == 'episode' && episodeTitle.length > 0) {\n title = episodeTitle; \n usingEpisodeTitle = true;\n }\n\n title = shared.stripSubtitle(title);\n\n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n if (usingEpisodeTitle) {\n authorString = '\"' + title.toTitleCase() + ',\" '\n }else{\n authorString = title.toTitleCase().italicize(); \n } \n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n if (citationData.type == 'time') {\n citationData.value = shared.fixTimeCitationData(citationData.value);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n //since time is treated differently here than from other places, replace / with :\n if (citationData.type == 'time') {\n citation.first = citation.first.split(\"/\").join(\":\");\n citation.subsequent = citation.subsequent.split(\"/\").join(\":\");\n }\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n //Series title [Audio podcast].\n let titlePart = '';\n let title = '';\n\n if (refData.type == 'series' || refData.type == 'interview') {\n title = shared.getStringValue(refData.title);\n }\n\n if (refData.type == 'episode') {\n title = shared.getStringValue(refData.episodeTitle);\n }\n\n let format = '';\n let episodeNumber = shared.getStringValue(refData.episodeNumber);\n\n switch (refData.kind) {\n case 'audio':\n\n if (refData.type == 'series') {\n format = '[Audio podcast]';\n }\n\n if (refData.type == 'episode') {\n format = '[Audio podcast episode]';\n }\n\n break;\n case 'video':\n\n if (refData.type == 'series') {\n format = '[Video podcast]';\n }\n\n if (refData.type == 'episode') {\n format = '[Video podcast episode]';\n }\n\n break;\n case 'radio':\n\n if (refData.type == 'series') {\n format = '[Radio series]';\n }\n\n if (refData.type == 'episode') {\n format = '[Radio series episode]';\n }\n\n break;\n }\n\n if (refData.type == 'interview') {\n format = '[Interview]';\n }\n\n if (title.length > 0) {\n\n if (title.startsWith('[')) {\n titlePart = title; \n }\n else{\n\n if (refData.type == 'series' || refData.type == 'interview') {\n title = title.italicize()\n }\n\n titlePart = title; \n }\n\n if (episodeNumber.length > 0) {\n titlePart = titlePart + ' ';\n\n if(shared.isInteger(episodeNumber)){\n titlePart = titlePart + '(No. ' + episodeNumber + ')';\n }\n else{\n titlePart = titlePart + '(' + episodeNumber + ')';\n }\n }\n\n if (format.length > 0) {\n\n if (title.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + format;\n }\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n //Hosta, A. A. (Host), & Producera, A. A. (Executive Producer).\n let authorPart = '';\n\n if (typeof refData.contributors === 'undefined') {\n return '';\n }\n\n if (refData.contributors.length == 0) {\n return '';\n }\n\n let filteredContribs = [];\n let typeAdded = false;\n let typeCount = 0;\n\n if (refData.type == 'series') {\n \n _forEach(refData.contributors, (item) => {\n if (item.type == 'host') {\n filteredContribs.push(item);\n\n if (!typeAdded) {\n typeAdded = true;\n typeCount++;\n }\n }\n });\n typeAdded = false;\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'executiveProducer') {\n filteredContribs.push(item);\n\n if (!typeAdded) {\n typeAdded = true;\n typeCount++;\n }\n }\n });\n typeAdded = false;\n }\n\n if (refData.type == 'episode') {\n \n _forEach(refData.contributors, (item) => {\n if (item.type == 'host') {\n filteredContribs.push(item);\n\n if (!typeAdded) {\n typeAdded = true;\n typeCount++;\n }\n }\n });\n typeAdded = false;\n }\n\n if (refData.type == 'interview') {\n \n _forEach(refData.contributors, (item) => {\n if (item.type == 'interview') {\n filteredContribs.push(item);\n\n if (!typeAdded) {\n typeAdded = true;\n typeCount++;\n }\n }\n });\n typeAdded = false;\n }\n\n authorPart = getPodcastReferenceNameString(filteredContribs, typeCount, false);\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let cleanedDate = '';\n\n if (refData.type == 'series') {\n //(2018–present).\n if (publicationDate.length == 0) {\n cleanedDate = 'n.d.';\n }\n else{\n cleanedDate = shared.fixPageDash(publicationDate);\n cleanedDate = cleanedDate.split(' ').join('');\n } \n }\n\n if (refData.type == 'episode' || refData.type == 'interview') {\n //(2018, April 1)\n cleanedDate = shared.getFullDate(publicationDate);\n }\n\n let datePart = '(' + cleanedDate + ').';\n\n return datePart;\n}\n\nfunction getEpisodeSourcePart(refData){\n //Episode\n //In A. A. Producera (Executive Producer), Series title. \n /// rest is pulled from the source part Production Company 1; Production Company 2. https://www.perrla.com/podcast-and-radio\n let episodeSourcePart = '';\n\n let filteredContribs = [];\n\n if (typeof refData.contributors != 'undefined') {\n _forEach(refData.contributors, (item) => {\n if (item.type == 'executiveProducer') {\n filteredContribs.push(item);\n }\n });\n }\n\n if (filteredContribs.length > 0) {\n let secondaryContribString = getPodcastReferenceNameString(filteredContribs, 1, true);\n\n episodeSourcePart = 'In ' + secondaryContribString;\n }\n\n let seriesTitle = shared.getStringValue(refData.title);\n\n if (seriesTitle.length > 0) {\n if (episodeSourcePart.length == 0) {\n episodeSourcePart = 'In ';\n }\n else{\n episodeSourcePart = episodeSourcePart + ', ';\n }\n\n if (seriesTitle.startsWith('[')) {\n episodeSourcePart = episodeSourcePart + seriesTitle; \n }\n else{\n episodeSourcePart = episodeSourcePart + seriesTitle.italicize();\n } \n }\n\n //make sure we end this with a period\n if (episodeSourcePart.length > 0) {\n if (!episodeSourcePart.endsWith('.')) {\n episodeSourcePart = episodeSourcePart + '.';\n } \n }\n\n let sourcePart = getSourcePart(refData);\n\n if (sourcePart.length > 0) {\n episodeSourcePart = episodeSourcePart + ' ' + sourcePart;\n }\n\n return episodeSourcePart;\n}\n\nfunction getSourcePart(refData){\n //Series\n //Production Company 1; Production Company 2. https://www.perrla.com/podcast-and-radio\n let sourcePart = '';\n let archiveName = shared.getStringValue(refData.archiveName);\n let publisherString = shared.getPublisherString(refData.publishers);\n let url = shared.getStringValue(refData.url);\n\n if (archiveName.length > 0) {\n sourcePart = archiveName;\n }\n\n if (publisherString != '.') {\n if (archiveName.length > 0) {\n sourcePart = sourcePart + '; ' + publisherString;\n }\n else{\n sourcePart = publisherString;\n } \n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}\n\nfunction getPodcastReferenceNameString(contributors, typeCount, isSecondary){\n var contributorstring = '';\n\n if (contributors.length > 0) {\n\n //Single\n if (contributors.length == 1) {\n if (isSecondary) {\n contributorstring = shared.getReverseCitationName(contributors[0]);\n }\n else{\n contributorstring = shared.getReferenceName(contributors[0]);\n }\n\n let label = getNameLabel(contributors[0], false);\n\n if (label.length > 0) {\n contributorstring = contributorstring + ' ' + label;\n }\n }\n\n //2-20\n if (contributors.length > 1 && contributors.length < 21) {\n var counter = 0;\n\n _forEach(contributors, (item) => {\n\n if (counter > 0) {\n\n if (counter == contributors.length - 1) {\n\n if (isSecondary && contributors.length == 2) {\n contributorstring = contributorstring + ' & ' \n }\n else{\n contributorstring = contributorstring + ', & '\n }\n }\n else{\n contributorstring = contributorstring + ', '\n }\n }\n\n if (isSecondary) {\n contributorstring = contributorstring + shared.getReverseCitationName(item);\n }\n else{\n contributorstring = contributorstring + shared.getReferenceName(item);\n }\n\n if (typeCount > 1) {\n let label = getNameLabel(contributors[counter], false);\n\n if (label.length > 0) {\n contributorstring = contributorstring + ' ' + label;\n }\n }\n\n counter++;\n });\n\n if (typeCount == 1) {\n let label = getNameLabel(contributors[0], true);\n\n if (label.length > 0) {\n contributorstring = contributorstring + ' ' + label;\n }\n }\n }\n\n //More Than Twenty\n if (contributors.length > 20) {\n var counter = 0;\n\n _forEach(contributors, (item) => {\n\n let label = getNameLabel(item);\n\n if (counter < 19) {\n if (counter > 0) {\n contributorstring = contributorstring + ', ' \n }\n\n if (isSecondary) {\n contributorstring = contributorstring + shared.getReverseCitationName(item);\n }\n else{\n contributorstring = contributorstring + shared.getReferenceName(item);\n }\n }\n else{\n if (counter == contributors.length - 1) {\n contributorstring = contributorstring + ',...'\n\n if (isSecondary) {\n contributorstring = contributorstring + shared.getReverseCitationName(item);\n }\n else{\n contributorstring = contributorstring + shared.getReferenceName(item);\n }\n }\n }\n\n if (label.length > 0 && typeCount > 1) {\n contributorstring = contributorstring + ' ' + label;\n }\n\n counter++;\n });\n }\n }\n \n return contributorstring;\n}\n\nfunction getNameLabel(contributor, plural){\n let label = '';\n\n switch (contributor.type) {\n case 'host':\n label = '(Host)';\n\n if (plural) {\n label = '(Hosts)';\n }\n\n break;\n case 'executiveProducer':\n label = '(Executive Producer)';\n\n if (plural) {\n label = '(Executive Producers)';\n }\n\n break;\n }\n\n return label;\n}","const _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\n//Breakdown Notes\n/*\nNo type or kind\n\n(AuthorPart) (DatePart) (TitlePart) (SourcePart)\n\nAuthorPart\n - Authors, Group Authors, Editors w/o Authors\n - Inverted names\n\nDatePart\n - Publication Date (Year)\n\nTitlePart\n - Title of the work (italics), \"[Press Release]\"\n\nSourcePart\n - Publisher, DOI, URL\n\n*/\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n \n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let workTitle = shared.getStringValue(refData.workTitle);\n\n //remove our subtitle for the citation\n if (workTitle.includes(':')) {\n var array = workTitle.split(\":\");\n workTitle = array[0];\n }\n\n authorString = workTitle.toTitleCase().italicize();\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n // - Title of the work (italics), \"[Press Release]\"\n let titlePart = '';\n\n let title = shared.getStringValue(refData.workTitle);\n \n if (title.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = title.italicize(); \n }\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' [Press release].';\n }\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors, unless this is an entry\n if (editorArray.length > 0 && refData.type != 'entry') {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n // - Publisher, DOI, URL\n let sourcePart = '';\n let publisherString = shared.getPublisherString(refData.publishers);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n sourcePart = publisherString; \n } \n }\n\n //url\n let url = shared.getStringValue(refData.url);\n\n //doi\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n \n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + doi;\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n return sourcePart;\n}","//BREAKDOWN NOTES\n/*\nType Question\nKind Quesstion\n\n-Type: (entry) Entry in a Reference Work\n - Kind: (encyclopeddia) Entry in an encyclopedia\n - Kind: (dictionary) Entry in a dictionary or thesaurus\n[AuthorPart][DatePart][EntryTitlePart][EntrySourcePart]\n - Kind: (wikipedia) Entry in Wikipedia\n[EntryTitlePart] [DatePart] [WikiSourcePart]\n\n- Type: (whole) Whole Reference Work\n - Kind: (encyclopedia) Encyclopedia\n - Kind: (dictionary) Dictionary or thesaurus\n[AuthorPart] [DatePart] [TitlePart] [SourcePart]\n\n\n- AuthorPart\n - Authors, Group Authors, Usernames, Editors without Authors\n- DatePart\n - Either a year, year-month-day, or n.d.\n- EntryTitlePart\n - Entry title\n- EntrySourcePart\n - \"In \", Editor, Reference Work Title, Publisher, Retrieval Date, URL/DOI\n- WikiSourcePart\n - \"In Wikipedia. \", Retrieval Date, Archived URL\n \n- TitlePart\n - Reference Work Title\n- SourcePart\n - Retrieval Date, URL/DOI\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0 || kind.length == 0) {\n return 'Type and Kind required.';\n }\n\n let datePart = getDatePart(refData);\n let authorPart = getAuthorPart(refData);\n\n switch (type) {\n case 'entry':\n\n let entryTitlePart = getEntryTitlePart(refData);\n\n switch (kind) {\n case 'encyclopedia':\n case 'dictionary':\n // [AuthorPart][DatePart][EntryTitlePart][EntrySourcePart]\n let entrySourcePart = getEntrySourcePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = entryTitlePart + ' ' + datePart + ' ' + entrySourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + entryTitlePart + ' ' + entrySourcePart;\n }\n\n break;\n case 'wikipedia':\n // [EntryTitlePart] [DatePart] [WikiSourcePart]\n let wikiSourcePart = getWikiSourcePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = entryTitlePart + ' ' + datePart + ' ' + wikiSourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + entryTitlePart + ' ' + wikiSourcePart;\n }\n\n break;\n }\n\n break;\n case 'whole':\n //[AuthorPart] [DatePart] [TitlePart] [SourcePart]\n let titlePart = getTitlePart(refData);\n let sourcePart = getSourcePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n break;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n\n let entryTitle = shared.getStringValue(refData.entryTitle);\n let referenceTitle = shared.getStringValue(refData.referenceTitle);\n\n if (refData.type == 'entry') {\n authorString = '\"' + entryTitle.toTitleCase() + ',\" '; \n }\n else{\n authorString = referenceTitle.toTitleCase().italicize();\n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n //if there ia publication date original also, include it before the publication date\n let publicationDateOriginal = shared.getYear(refData.originalPublicationDate);\n \n if (publicationDateOriginal.length == 0 && (refData.type == 'reprinted')) {\n publicationDateOriginal = 'n.d.';\n }\n\n if (publicationDateOriginal.length > 0) {\n year = publicationDateOriginal + '/'+ year;\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getDatePart(refData) {\n\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getTitlePart(refData){\n // - Title of Book, Translated Title, Editors, Translators, Edition\n let titlePart = '';\n\n let title = shared.getStringValue(refData.referenceTitle);\n \n if (title.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = title.italicize(); \n }\n\n //editors\n let editorArray = shared.getEditors(refData.contributors);\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n\n //edition\n let edition = shared.getStringValue(refData.edition);\n\n let authorArray = shared.getAuthors(refData.contributors);\n\n //build our secondary contributors portion\n if ((editorString.length > 0 && authorArray.length > 0) ||\n edition.length > 0) {\n \n var isFirstNames = true;\n\n titlePart = titlePart + ' (';\n\n if (editorString.length > 0 && authorArray.length > 0) {\n titlePart = titlePart + editorString;\n isFirstNames = false;\n }\n\n if ((edition.length > 0) && !isFirstNames) {\n titlePart = titlePart + ';';\n }\n\n if (edition.length > 0) {\n if (!isFirstNames) {\n titlePart = titlePart + ' ';\n isFirstNames = false;\n }\n\n edition = shared.fixEditionString(edition);\n\n titlePart = titlePart + edition;\n }\n\n titlePart = titlePart + ')';\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors, unless this is an entry\n if (editorArray.length > 0 && refData.type != 'entry') {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n return authorPart;\n}\n\nfunction getSourcePart(refData){\n let sourcePart = '';\n\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n let publisherString = shared.getPublisherString(refData.publishers);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n sourcePart = publisherString; \n } \n }\n\n if (retrievalDate.length > 0) {\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + 'Retrieved';\n sourcePart = sourcePart + ' ' + shared.formatRetrievalDate(retrievalDate); \n sourcePart = sourcePart + ', from' ;\n }\n\n //url\n let url = shared.getStringValue(refData.url);\n\n //doi\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n\n doi = shared.appendDOIURL(doi);\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + doi;\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n return sourcePart;\n}\n\nfunction getEntryTitlePart(refData){\n let entryTitle = shared.getStringValue(refData.entryTitle);\n let titlePart = '';\n\n if (entryTitle.length > 0) {\n titlePart = entryTitle;\n\n titlePart = shared.fixTitlePartClosure(titlePart); \n }\n \n return titlePart;\n}\n\nfunction getEntrySourcePart(refData){\n let entrySourcePart = 'In';\n\n let title = shared.getStringValue(refData.referenceTitle);\n let edition = shared.getStringValue(refData.edition);\n let normalSourcePart = getSourcePart(refData);\n\n //editors\n let editorArray = shared.getEditors(refData.contributors);\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ' (Ed.)';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ' (Eds.)';\n }\n }\n\n if (editorString.length > 0) {\n entrySourcePart = entrySourcePart + ' ' + editorString + ',';\n }\n\n if (title.length > 0) {\n entrySourcePart = entrySourcePart + ' ' + title.italicize();\n }\n\n if (edition.length > 0) {\n entrySourcePart = entrySourcePart + ' (';\n\n edition = shared.fixEditionString(edition);\n\n entrySourcePart = entrySourcePart + edition;\n entrySourcePart = entrySourcePart + ')'\n }\n\n if (entrySourcePart == 'In') {\n entrySourcePart = normalSourcePart;\n }\n else{\n entrySourcePart = entrySourcePart + '.'\n\n //append our normal source part on here\n entrySourcePart = entrySourcePart + ' ' + normalSourcePart;\n }\n\n return entrySourcePart;\n}\n\nfunction getWikiSourcePart(refData){\n //\"In Wikipedia. \", Retrieval Date, Archived URL\n let sourcePart = 'In Wikipedia.';\n\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n\n if (retrievalDate.length > 0) {\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + 'Retrieved';\n sourcePart = sourcePart + ' ' + shared.formatRetrievalDate(retrievalDate); \n sourcePart = sourcePart + ', from' ;\n }\n\n //url\n let url = shared.getStringValue(refData.url);\n\n //doi\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n\n doi = shared.appendDOIURL(doi);\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + doi;\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n return sourcePart;\n}","/*\n*****Regulations*****\n \nDocumentation: \nFORM: https://docs.google.com/spreadsheets/d/1Xh5m6m6Jz3eA_zQfsOwO58WlrXJ9ICW5WiWwhtD8c3M/edit#gid=2071428744\nMOCKUP: http://magical-design-system.webflow.io/add-in/wizard/wizard-2-federal-reports-regulations\n\nType & Kind Questions\n- Types:\n - report: This has two kinds (senate & house)\n - regulation: This has two kinds (codified & uncodified)\n\n- Report Senate\n S. Rep. No. [reportNumber] ([publicationDate]). [url]\n *** publicationDate here is YYYY\n\n- Report House\n H.R. Rep. No. [reportNumber] ([publicationDate]). [url]\n *** publicationDate here is YYYY\n\n- Regulation Codified\n [title], [volume] C.F.R. § [section] ([publicationDate]). [url]\n *** publicationDate here is YYYY\n\n- Regulation Uncodified\n [title], [proposedVolume] F.R. [pageNumber] (proposed [publicationDate]) (to be codified at [volume] C.F.R. § [section]). [url]\n *** publicationDate here is MM DD, YYYY\n\n*/\n\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0 || kind.length == 0) {\n return 'Type and Kind required.';\n }\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let url = shared.getStringValue(refData.url);\n\n switch (type) {\n case 'report':\n // H.R. Rep. No. [reportNumber] ([publicationDate]). [url]\n // S. Rep. No. [reportNumber] ([publicationDate]). [url]\n let reportNumber = shared.getStringValue(refData.reportNumber);\n let label = '';\n\n if(kind == 'senate'){\n label = 'S. Rep.';\n }\n\n if(kind == 'house'){\n label = 'H.R. Rep.';\n }\n\n referenceValue = label;\n\n if(reportNumber.length > 0){\n referenceValue = referenceValue + ' No. ' + reportNumber;\n }\n\n if(publicationDate.length > 0){\n referenceValue = referenceValue + ' (' + publicationDate + ').';\n }\n\n if(url.length > 0){\n url = shared.formatURL(url);\n referenceValue = referenceValue + ' ' + url;\n }\n\n break;\n case 'regulation':\n //codified\n //[title], [volume] C.F.R. § [section] ([publicationDate]). [url]\n \n //uncodified\n // [title], [proposedVolume] F.R. [pageNumber] (proposed [publicationDate]) (to be codified at [volume] C.F.R. § [section]). [url]\n\n let title = shared.getStringValue(refData.title);\n let volume = shared.getStringValue(refData.volume);\n let section = shared.getStringValue(refData.section);\n section = formatSectionString(section);\n\n if(title.length > 0){\n referenceValue = title;\n }\n\n switch (kind) {\n case 'codified':\n \n if(volume.length > 0)\n {\n if(referenceValue.length > 0){\n referenceValue = referenceValue + ', ';\n }\n\n referenceValue = referenceValue + volume;\n }\n\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' ';\n }\n\n referenceValue = referenceValue + 'C.F.R.';\n\n if(section.length > 0)\n {\n referenceValue = referenceValue + ' ' + section;\n }\n\n if(publicationDate.length > 0){\n referenceValue = referenceValue + ' (' + publicationDate + ').';\n }\n\n break;\n case 'uncodified':\n let proposedVolume = shared.getStringValue(refData.proposedVolume);\n let pageNumber = shared.getStringValue(refData.pageNumber);\n let proposedDate = shared.getStringValue(refData.proposedDate);\n\n if(proposedVolume.length > 0)\n {\n if(referenceValue.length > 0){\n referenceValue = referenceValue + ', ';\n }\n\n referenceValue = referenceValue + proposedVolume;\n }\n\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' ';\n }\n\n referenceValue = referenceValue + 'F.R.';\n\n if(pageNumber.length > 0)\n {\n referenceValue = referenceValue + ' ' + pageNumber;\n }\n\n if(proposedDate.length > 0)\n {\n referenceValue = referenceValue + ' (proposed ' + shared.getReverseFullDate(proposedDate) + ')';\n }\n\n if(volume.length > 0 || section.length > 0)\n {\n referenceValue = referenceValue + ' (to be codified at ';\n\n if (volume.length > 0) {\n referenceValue = referenceValue + volume + ' C.F.R.'; \n }\n\n if (section.length == 0) {\n section = '§ ___';\n }\n\n if (section.length > 0) {\n\n if (!referenceValue.endsWith(' ')) {\n referenceValue = referenceValue + ' ';\n }\n\n referenceValue = referenceValue + section; \n }\n\n referenceValue = referenceValue + ')'; \n }\n\n referenceValue = referenceValue + '.'\n\n break;\n }\n\n if(url.length > 0){\n url = shared.formatURL(url);\n referenceValue = referenceValue + ' ' + url;\n }\n\n break;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: '',\n datePart: ''\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData) {\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n let authorString = '';\n switch (type) {\n case 'report':\n let reportNumber = shared.getStringValue(refData.reportNumber);\n let label = '';\n\n if(kind == 'senate'){\n label = 'S. Rep.';\n }\n\n if(kind == 'house'){\n label = 'H.R. Rep.';\n }\n\n authorString = label;\n\n if(reportNumber.length > 0){\n authorString = authorString + ' No. ' + reportNumber;\n }\n \n break;\n case 'regulation':\n let shortTitle = shared.getStringValue(refData.shortTitle);\n let title = shared.getStringValue(refData.title);\n\n if (shortTitle.length > 0) {\n authorString = shortTitle;\n }\n else{\n authorString = title;\n }\n\n break;\n }\n\n let year = shared.getYear(refData.publicationDate);\n let proposedYear = shared.getYear(refData.proposedDate);\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n\n if (proposedYear.length > 0) {\n year = proposedYear; \n }\n else{\n year = 'n.d.';\n }\n }\n\n let citation = shared.getCitations(citationData, authorString, year, []);\n\n return citation;\n}\n\nfunction formatSectionString(section){\n let prefix = '§';\n\n if (section.length == 0) {\n return '';\n }\n\n if (section.includes('-') || section.includes('–') || section.includes('—')) {\n prefix = '§§';\n }\n\n section = prefix + ' ' + section; \n \n return section;\n}","const _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\n//BREAKDOWN NOTES\n/*\n\n-There isn't a type/kind for Religious Texts\n[TitlePart] [DatePart] [SourcePart]\n\n-TitlePart\n - Title of the work, Editors, Translators, Edition\n- DatePart\n - Either a year or n.d.\n- SourcePart\n - Publishers, DOI/URL, Original Publication Date\n*/\n\n\nfunction getReference (refData){\n\n let referenceValue = '';\n let titlePart = getTitlePart(refData);\n let sourcePart = getSourcePart(refData);\n let datePart = getDatePart(refData);\n\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n\n let reference = {\n value : referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: titlePart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs){\n let firstCitation = ''\n\n // (Author, YYYY, location)\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n let location = shared.getCitationLocationString(citationData);\n\n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n //Graysen is verifying if this is needed or not\n // let editorArray = shared.getEditors(refData.contributors);\n\n // if (editorArray.length > 0) {\n // authorString = shared.getCitationAuthorString(editorArray, false);\n // }\n // else{\n let titlePart = '';\n\n let title = shared.getStringValue(refData.bookTitle);\n let version = shared.getStringValue(refData.version);\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if(version === ''){\n if (translatedTitle == '') {\n // no translated title\n title = title.appendData(version, ': ');\n \n if (title.length > 0) {\n if (title.startsWith('[')) {\n titlePart = title; \n } else{\n titlePart = title.italicize();\n } \n }\n \n } else {\n if (!translatedTitle.startsWith('[')) {\n translatedTitle = '[' + translatedTitle + ']';\n }\n titlePart = translatedTitle;\n }\n\n } else {\n // console.log('version has content');\n title = title.appendData(version, ': ');\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n titlePart = title; \n } else{\n titlePart = title.toTitleCase().italicize();\n } \n }\n }//e:if:else\n\n // console.log();\n firstCitation = firstCitation.appendData(titlePart);\n // }\n }\n\n if (authorString.length > 0) {\n firstCitation = authorString;\n }\n\n //if there ia publication date original also, include it before the publication date\n let publicationDateOriginal = shared.getYear(refData.originalPublicationDate);\n firstCitation = firstCitation.appendData(publicationDateOriginal, ', ');\n\n let publicationDateInput = shared.getStringValue(refData.publicationDate); // what the user actually typed in\n\n if(publicationDateInput === ''){\n // no date entered\n firstCitation = firstCitation.appendData('n.d.', ', ');\n\n } else {\n // user entered data for publicationDate - look at it closer\n let publicationYearOnly = '';\n publicationYearOnly = shared.getYear(refData.publicationDate); // the extracted YEAR (a user could type something like ca. 500 B.C.E which should be an empty string here)\n\n // are there any NON numeric character in this?\n if(publicationYearOnly.match(/[^0-9]/gmi)){\n // Yes there are, assume \"ca. 500 B.C.E\"\n firstCitation = firstCitation.appendData(publicationDateInput, ', ');\n } else {\n // No it's just numbers, assume \"2000\"\n if(publicationDateOriginal === ''){\n firstCitation = firstCitation.appendData(publicationYearOnly, ', ');\n } else {\n firstCitation = firstCitation.appendData(publicationYearOnly, '/');\n }\n }//e:if:else\n\n \n }//e:if:else\n \n firstCitation = firstCitation.appendData(location, ', ');\n\n \n \n var subsequentCitation = '';\n\n //if there is a group author, and it's in the first two contributors....and that group auther has an abbreviation, we have a different subsequent\n var contributorCounter = 0;\n var hasSubsequent = false;\n\n authorArray.forEach(item => {\n if (item.type == 'groupAuthor') {\n //authorArray.push(item);\n if (contributorCounter < 2) {\n var abbreviation = shared.getStringValue(item.abbreviation);\n\n if (abbreviation.length > 0) {\n hasSubsequent = true;\n }\n }\n }\n\n contributorCounter++;\n });\n\n if (hasSubsequent) {\n let subsequentAuthorString = shared.getCitationAuthorString(authorArray, true, paperRefs);\n subsequentCitation = subsequentAuthorString + ', ' + year; \n\n if (location.length > 0) {\n subsequentCitation = subsequentCitation + ', ' + location;\n }\n }\n\n let citation = {\n first : String(firstCitation),\n subsequent : String(subsequentCitation)\n }\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n //The Work: Work subtitle [Translated title] (A. A. Editora, B. B. Editorb Jr., & C. C. Editorc, Eds.; A. A. Translatora, Trans.; 2nd ed.).\n let titlePart = '';\n\n let edition = shared.getStringValue(refData.edition);\n\n //editors\n let editorArray = shared.getEditors(refData.contributors);\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n\n //translators\n let translatorString = shared.getTranslatorString(refData.contributors);\n\n //editor and translator string\n //this is only the scenario where they all match and we don't need the individual string\n let editorTranslatorString = shared.getEditorTranslatorString(refData.contributors);\n\n if (editorTranslatorString.length >0) {\n editorString = '';\n translatorString = '';\n }\n\n let title = shared.getStringValue(refData.bookTitle);\n let version = shared.getStringValue(refData.version);\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if(version === ''){\n // no version, is there a translated title?\n if (translatedTitle == '') {\n // no translated title\n title = title.appendData(version, ': ');\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n titlePart = title; \n } else{\n titlePart = title.italicize();\n } \n }\n \n } else {\n if (!translatedTitle.startsWith('[')) {\n translatedTitle = '[' + translatedTitle + ']';\n }\n titlePart = translatedTitle;\n }\n\n } else {\n title = title.appendData(version, ': ');\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n titlePart = title; \n } else{\n titlePart = title.italicize();\n } \n }\n\n }//e:if:else\n \n //build our secondary contributors portion\n if ((editorString.length > 0) ||\n translatorString.length > 0 ||\n editorTranslatorString.length > 0||\n edition.length > 0) {\n \n var isFirstNames = true;\n\n titlePart = titlePart + ' (';\n\n if (editorTranslatorString.length > 0) {\n titlePart = titlePart + editorTranslatorString;\n isFirstNames = false;\n }\n\n if (editorString.length > 0) {\n titlePart = titlePart + editorString;\n isFirstNames = false;\n }\n\n if (translatorString.length > 0) {\n if (isFirstNames) {\n titlePart = titlePart + translatorString; \n }\n else{\n titlePart = titlePart + '; ' + translatorString; \n }\n isFirstNames = false;\n }\n\n if ((edition.length > 0) && !isFirstNames) {\n titlePart = titlePart + ';';\n }\n\n if (edition.length > 0) {\n if (!isFirstNames) {\n titlePart = titlePart + ' ';\n isFirstNames = false;\n }\n\n edition = shared.fixEditionString(edition);\n\n titlePart = titlePart + edition;\n }\n\n titlePart = titlePart + ')';\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n //Publisher Name; Publisher Name 2; Publisher Name 3. https://doi.org/10.123456789/ (Original work published ca. 1720)\n let sourcePart = '';\n let publisherString = shared.getPublisherString(refData.publishers);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n sourcePart = publisherString; \n } \n }\n\n //url\n let url = shared.getStringValue(refData.url);\n\n //doi\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi); \n }\n \n if (doi.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + doi;\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n //publication Date Original\n let publicationDateOriginal = shared.getStringValue(refData.originalPublicationDate);\n\n if (publicationDateOriginal.length > 0) {\n sourcePart = sourcePart + ' (Original work published ' + publicationDateOriginal + ')';\n }\n\n return sourcePart;\n}","/*\n*****Reviews*****\n \nFORM: https://docs.google.com/spreadsheets/d/1aw9yq_RdsyVby8blbl-7OJ9FF5B85F_CqU1q39evYyk/edit#gid=2071428744\nMOCKUP: https://magical-design-system.webflow.io/add-in/wizard/wizard-2-reviews\n\nTYPES:\n periodical\n - used for newspapers, magazines, & journals\n \n website\n - used for reviews found on website\n blog\n - reviews posted as part of a blog\n\nKINDS:\n book\n - uses \"[Review of the book...]\"\n - [title] is italicized\n film\n - uses \"[Review of the film...]\"\n - [title] is italicized\n album\n - uses \"[Review of the album...]\"\n - [title] is italicized\n song\n - uses \"[Review of the song...]\"\n - [title] is put in quotation marks\n tvSeries\n - uses \"[Review of the television series...]\"\n - [title] is italicized\n tvEpisode\n -uses \"[Review of the television series episode...]\"\n - [title] is put in quotation marks\n other\n - uses \"[Review of the [worktype]...]\"\n - [title] is italicized\n\nPARTS:\n\nAuthorPart\n All\n -[contributor.author].\n\nDatePart\n All\n - ([publicationDate]).\n\nTitlePart\n Periodical\n \"[Review of the \" + [worktype text & formatting is dependent on Kind] + [secondary contributors with titles] + \"].\" \n Website\n \"[Review of the \" + [worktype text & formatting is dependent on Kind] + [secondary contributors with titles] + \"].\"\n Blog\n \"[Review of the \" + [worktype text & formatting is dependent on Kind] + [secondary contributors with titles] + \"].\"\n\nSourcePart\n Periodical\n [periodical], [volume]([issue]), [pageNumbers]. \"\n Website\n [website]. \n Blog\n [blog]. \n\n*/\n\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n //referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart;\n referenceValue = titlePart + ' ' + sourcePart;\n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n let type = refData.type;\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.title);\n title = shared.stripSubtitle(title);\n\n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n if (type == 'website') {\n authorString = title.toTitleCase().italicize(); \n }\n else{\n authorString = '\"' + title.toTitleCase() + ',\" ';\n }\n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n else{\n year = shared.fixPageDash(year);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n let kind = shared.getStringValue(refData.kind);\n \n switch (kind) {\n case 'book':\n titlePart = getBookTitlePart(refData);\n break;\n case 'film':\n titlePart = getFilmTitlePart(refData);\n break;\n case 'album':\n titlePart = getAlbumTitlePart(refData);\n break;\n case 'song':\n titlePart = getSongTitlePart(refData);\n break;\n case 'tvSeries':\n titlePart = getTVSeriesTitlePart(refData);\n break;\n case 'tvEpisode':\n titlePart = getTVEpisodeTitlePart(refData);\n break;\n case 'other':\n titlePart = getOtherTitlePart(refData);\n break;\n }\n\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart);\n }\n \n return titlePart;\n}\n\nfunction getBookTitlePart(refData){\n let titlePart = '';\n let title = shared.getStringValue(refData.title);\n let reviewedTitle = shared.getStringValue(refData.reviewedTitle);\n let reviewAuthors = getReviewAuthors(refData.contributors);\n let secondaryContribsString = shared.getReferenceNameString(reviewAuthors, true);\n let type = shared.getStringValue(refData.type);\n\n if (title.length > 0) {\n if (type == 'website') {\n titlePart = title.italicize();\n }\n else{\n titlePart = title;\n }\n }\n\n if (reviewedTitle.length > 0 || secondaryContribsString.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[Review of the book ';\n\n if (reviewedTitle.length > 0) {\n titlePart = titlePart + reviewedTitle.italicize();\n\n if (secondaryContribsString.length > 0) {\n titlePart = titlePart + ', ';\n }\n }\n\n if (secondaryContribsString.length > 0) {\n titlePart = titlePart + 'by ' + secondaryContribsString;\n }\n\n titlePart = titlePart + ']'; \n }\n \n return titlePart;\n}\n\nfunction getFilmTitlePart(refData){\n let titlePart = '';\n\n // film\n // - uses \"[Review of the film...]\"\n // - [title] is italicized\n\n let title = shared.getStringValue(refData.title);\n let reviewedTitle = shared.getStringValue(refData.reviewedTitle);\n let reviewContribs = getReviewFilmContribs(refData.contributors);\n let secondaryContribsString = getFilmReferenceNameString(reviewContribs);\n let type = shared.getStringValue(refData.type);\n\n if (title.length > 0) {\n if (type == 'website') {\n titlePart = title.italicize();\n }\n else{\n titlePart = title;\n }\n }\n\n if (reviewedTitle.length > 0 || secondaryContribsString.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[Review of the film ';\n\n if (reviewedTitle.length > 0) {\n titlePart = titlePart + reviewedTitle.italicize();\n\n if (secondaryContribsString.length > 0) {\n titlePart = titlePart + ', ';\n }\n }\n\n if (secondaryContribsString.length > 0) {\n titlePart = titlePart + 'by ' + secondaryContribsString;\n }\n\n titlePart = titlePart + ']'; \n }\n \n return titlePart;\n}\n\nfunction getAlbumTitlePart(refData){\n // album\n // - uses \"[Review of the album...]\"\n // - [title] is italicized\n let titlePart = '';\n let title = shared.getStringValue(refData.title);\n let reviewedTitle = shared.getStringValue(refData.reviewedTitle);\n let reviewContribs = getReviewArtists(refData.contributors);\n let secondaryContribsString = shared.getReferenceNameString(reviewContribs, true);\n let type = shared.getStringValue(refData.type);\n\n if (title.length > 0) {\n if (type == 'website') {\n titlePart = title.italicize();\n }\n else{\n titlePart = title;\n }\n }\n\n if (reviewedTitle.length > 0 || secondaryContribsString.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[Review of the album ';\n\n if (reviewedTitle.length > 0) {\n titlePart = titlePart + reviewedTitle.italicize();\n\n if (secondaryContribsString.length > 0) {\n titlePart = titlePart + ', ';\n }\n }\n\n if (secondaryContribsString.length > 0) {\n titlePart = titlePart + 'by ' + secondaryContribsString;\n }\n\n titlePart = titlePart + ']'; \n }\n \n return titlePart;\n}\n\nfunction getSongTitlePart(refData){\n // song\n // - uses \"[Review of the song...]\"\n // - [title] is put in quotation marks\n let titlePart = '';\n let title = shared.getStringValue(refData.title);\n let reviewedTitle = shared.getStringValue(refData.reviewedTitle);\n let reviewContribs = getReviewArtists(refData.contributors);\n let secondaryContribsString = shared.getReferenceNameString(reviewContribs, true);\n let type = shared.getStringValue(refData.type);\n\n if (title.length > 0) {\n if (type == 'website') {\n titlePart = title.italicize();\n }\n else{\n titlePart = title;\n }\n }\n\n if (reviewedTitle.length > 0 || secondaryContribsString.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[Review of the song ';\n\n if (reviewedTitle.length > 0) {\n titlePart = titlePart + '\"' + reviewedTitle;\n\n if (secondaryContribsString.length > 0) {\n titlePart = titlePart + ',';\n }\n\n titlePart = titlePart + '\"'\n\n if (secondaryContribsString.length > 0) {\n titlePart = titlePart + ' ';\n }\n }\n\n if (secondaryContribsString.length > 0) {\n titlePart = titlePart + 'by ' + secondaryContribsString;\n }\n\n titlePart = titlePart + ']'; \n }\n \n return titlePart;\n}\n\nfunction getTVSeriesTitlePart(refData){\n let titlePart = '';\n\n // tvSeries\n // - uses \"[Review of the television series...]\"\n // - [title] is italicized\n\n let title = shared.getStringValue(refData.title);\n let reviewedTitle = shared.getStringValue(refData.reviewedTitle);\n let secondaryContribsString = getTVReferenceNameString(refData);\n let authorPart = getAuthorPart(refData);\n let type = shared.getStringValue(refData.type);\n\n if (title.length > 0) {\n if (type == 'website') {\n titlePart = title.italicize();\n }\n else{\n titlePart = title;\n }\n }\n\n if (authorPart.length == 0) {\n let datePart = getDatePart(refData);\n\n if (titlePart.length > 0) {\n\n if (!titlePart.endsWith('.')) {\n titlePart = titlePart + '.';\n }\n\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + datePart;\n }\n\n if (reviewedTitle.length > 0 || secondaryContribsString.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[Review of the TV series ';\n\n if (reviewedTitle.length > 0) {\n titlePart = titlePart + reviewedTitle.italicize();\n\n if (secondaryContribsString.length > 0) {\n titlePart = titlePart + ', ';\n }\n }\n\n if (secondaryContribsString.length > 0) {\n titlePart = titlePart + 'by ' + secondaryContribsString;\n }\n\n titlePart = titlePart + ']'; \n }\n \n return titlePart;\n}\n\nfunction getTVEpisodeTitlePart(refData){\n let titlePart = '';\n\n // tvEpisode\n // -uses \"[Review of the television series episode...]\"\n // - [title] is put in quotation marks\n\n let title = shared.getStringValue(refData.title);\n let reviewedTitle = shared.getStringValue(refData.reviewedTitle);\n let secondaryContribsString = getTVReferenceNameString(refData);\n let authorPart = getAuthorPart(refData);\n let type = shared.getStringValue(refData.type);\n\n if (title.length > 0) {\n\n if (type == 'website') {\n titlePart = title.italicize();\n }\n else{\n titlePart = title;\n }\n }\n\n if (authorPart.length == 0) {\n let datePart = getDatePart(refData);\n\n if (titlePart.length > 0) {\n\n if (!titlePart.endsWith('.')) {\n titlePart = titlePart + '.';\n }\n\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + datePart;\n }\n\n if (reviewedTitle.length > 0 || secondaryContribsString.length > 0) {\n if (titlePart.length > 0) {\n if (!titlePart.endsWith(' ')) {\n titlePart = titlePart + ' '; \n }\n }\n\n titlePart = titlePart + '[Review of the TV series episode ';\n\n if (reviewedTitle.length > 0) {\n titlePart = titlePart + '\"' + reviewedTitle;\n\n if (secondaryContribsString.length > 0) {\n titlePart = titlePart + ',';\n }\n\n titlePart = titlePart + '\"'\n\n if (secondaryContribsString.length > 0) {\n titlePart = titlePart + ' ';\n }\n }\n\n if (secondaryContribsString.length > 0) {\n titlePart = titlePart + 'by ' + secondaryContribsString;\n }\n\n titlePart = titlePart + ']'; \n }\n \n return titlePart;\n}\n\nfunction getOtherTitlePart(refData){\n let titlePart = '';\n\n // other\n // - uses \"[Review of the [worktype]...]\"\n // - [title] is italicized\n\n let title = shared.getStringValue(refData.title);\n let reviewedTitle = shared.getStringValue(refData.reviewedTitle);\n let reviewContribs = getReviewComposers(refData.contributors);\n let secondaryContribsString = getFilmReferenceNameString(reviewContribs); //works the same as film so re-use\n let workType = shared.getStringValue(refData.workType);\n let type = shared.getStringValue(refData.type);\n\n if (title.length > 0) {\n if (type == 'website') {\n titlePart = title.italicize();\n }\n else{\n titlePart = title;\n }\n }\n\n if (reviewedTitle.length > 0 || secondaryContribsString.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[Review of the ' + workType + ' ';\n\n if (reviewedTitle.length > 0) {\n\n if (reviewedTitle.startsWith('\"')) {\n titlePart = titlePart + reviewedTitle;\n }\n else {\n titlePart = titlePart + reviewedTitle.italicize();\n }\n\n if (secondaryContribsString.length > 0) {\n\n if (reviewedTitle.endsWith('\"')) {\n titlePart = titlePart.slice(0, -1) + ',\" ';\n }\n else {\n titlePart = titlePart + ', ';\n }\n }\n }\n\n if (secondaryContribsString.length > 0) {\n titlePart = titlePart + 'by ' + secondaryContribsString;\n }\n\n titlePart = titlePart + ']'; \n }\n \n return titlePart;\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0) {\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\n\nfunction getSourcePart(refData){\n let sourcePart = '';\n\n let type = shared.getStringValue(refData.type);\n\n switch (type) {\n case 'periodical':\n sourcePart = getPeriodicalSourcePart(refData);\n break;\n case 'website':\n sourcePart = getWebsiteSourcePart(refData);\n break;\n case 'blog':\n sourcePart = getBlogSourcePart(refData);\n break;\n }\n\n return sourcePart;\n}\n\nfunction getPeriodicalSourcePart(refData){\n let sourcePart = '';\n // Periodical\n // [periodical], [volume]([issue]), [pageNumbers]. \"\n //Periodical Title, 42(11), 12–14. https://doi.org/10.12345\n\n let periodical = shared.getStringValue(refData.periodical);\n let volume = shared.getStringValue(refData.volume);\n let issue = shared.getStringValue(refData.issue);\n let pageNumbers = shared.getStringValue(refData.pageNumbers);\n let doi = shared.getStringValue(refData.doi);\n let url = shared.getStringValue(refData.url);\n\n if (periodical.length > 0) {\n sourcePart = periodical.italicize();\n }\n\n if (volume.length > 0) {\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', ';\n }\n\n sourcePart = sourcePart + volume.italicize(); \n }\n\n if (issue.length > 0) {\n if (volume.length == 0) {\n sourcePart = sourcePart + ', ';\n }\n\n sourcePart = sourcePart + '(' + issue + ')';\n }\n\n if (pageNumbers.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', ';\n }\n\n pageNumbers = shared.fixPageDash(pageNumbers);\n\n sourcePart = sourcePart + pageNumbers;\n }\n\n if (sourcePart.length > 0) {\n if (!sourcePart.endsWith('.')) {\n sourcePart = sourcePart + '.';\n }\n }\n\n if (doi.length > 0) {\n\n doi = shared.appendDOIURL(doi);\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + doi;\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + url;\n }\n }\n\n return sourcePart;\n}\n\nfunction getWebsiteSourcePart(refData){\n let sourcePart = '';\n // Website\n // [website]. \n //Reviews R Us. https://www.perrla.com/reviews\n let website = shared.getStringValue(refData.website);\n let url = shared.getStringValue(refData.url);\n\n if (website.length > 0) {\n sourcePart = website;\n\n if (!sourcePart.endsWith('.')) {\n sourcePart = sourcePart + '.';\n }\n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}\n\nfunction getBlogSourcePart(refData){\n let sourcePart = '';\n // Blog\n // [blog]. \n //Blog Name. https://www.perrla.com/reviews\n let blog = shared.getStringValue(refData.blog);\n let url = shared.getStringValue(refData.url);\n\n if (blog.length > 0) {\n sourcePart = blog.italicize();\n\n if (!sourcePart.endsWith('.')) {\n sourcePart = sourcePart + '.';\n }\n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}\n\n\nfunction getReviewAuthors(contributors){\n let contribArray = [];\n\n if (typeof contributors === 'undefined') {\n return contribArray;\n }\n\n _forEach(contributors, (item) => {\n if (item.type == 'reviewAuthor' || item.type == 'reviewEditor') {\n contribArray.push(item);\n }\n });\n\n return contribArray;\n}\n\nfunction getReviewArtists(contributors){\n let contribArray = [];\n\n if (typeof contributors === 'undefined') {\n return contribArray;\n }\n\n _forEach(contributors, (item) => {\n if (item.type == 'reviewArtist' || item.type == 'reviewGroupArtist') {\n contribArray.push(item);\n }\n });\n\n return contribArray;\n}\n\nfunction getReviewFilmContribs(contributors){\n let contribArray = [];\n\n if (typeof contributors === 'undefined') {\n return contribArray;\n }\n\n _forEach(contributors, (item) => {\n if (item.type == 'reviewDirector' || item.type == 'reviewWriter' || item.type == 'reviewWriterDirector') {\n contribArray.push(item);\n }\n });\n\n return contribArray;\n}\n\nfunction getReviewComposers(contributors){\n let contribArray = [];\n\n if (typeof contributors === 'undefined') {\n return contribArray;\n }\n\n _forEach(contributors, (item) => {\n if (item.type == 'reviewComposer') {\n contribArray.push(item);\n }\n });\n\n return contribArray;\n}\n\n\nfunction getFilmReferenceNameString(contributors){\n var contributorstring = '';\n\n if (contributors.length > 0) {\n\n //Single\n if (contributors.length == 1) {\n contributorstring = shared.getReferenceName(contributors[0]);\n\n let label = getLabelForContributorType(contributors[0]);\n\n if (label.length > 0) {\n contributorstring = contributorstring + ', ' + label;\n }\n }\n\n //2-20\n if (contributors.length > 1 && contributors.length < 21) {\n var counter = 0;\n\n _forEach(contributors, (item) => {\n\n if (counter > 0) {\n\n if (counter == contributors.length - 1) {\n contributorstring = contributorstring + ', & '\n }\n else{\n contributorstring = contributorstring + ', '\n }\n }\n\n contributorstring = contributorstring + shared.getReferenceName(item);\n\n let label = getLabelForContributorType(contributors[counter]);\n\n if (label.length > 0) {\n contributorstring = contributorstring + ', ' + label;\n }\n\n counter++;\n });\n }\n\n //More Than Twenty\n if (contributors.length > 20) {\n var counter = 0;\n\n _forEach(contributors, (item) => {\n\n let label = getLabelForContributorType(item);\n\n if (counter < 19) {\n if (counter > 0) {\n contributorstring = contributorstring + ', ' \n }\n contributorstring = contributorstring + shared.getReferenceName(item);\n }\n else{\n if (counter == contributors.length - 1) {\n contributorstring = contributorstring + ',...'\n contributorstring = contributorstring + shared.getReferenceName(item);\n }\n }\n\n if (label.length > 0) {\n contributorstring = contributorstring + ', ' + label;\n }\n\n counter++;\n });\n }\n }\n \n return contributorstring;\n}\n\nfunction getTVReferenceNameString(refData){\n //Authora, A. A. (Writer), Authorb, B. B. (Director), & Authorc, C. C. (Writer & Director).\n let authorPart = '';\n\n //order by: writer, director, then writer & director\n //then order by the way they are listed\n //custom at the end\n\n if (typeof refData.contributors === 'undefined') {\n return '';\n }\n\n if (refData.contributors.length == 0) {\n return '';\n }\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n let writerArray = [];\n let directorArray = [];\n let writerDirectorArray = [];\n let customArray = [];\n let authorCount = 0;\n let typeCount = 0;\n\n let typeAdded = false;\n _forEach(refData.contributors, (item) => {\n if (item.type == 'reviewWriter') {\n writerArray.push(item);\n authorCount++;\n\n if (!typeAdded) {\n typeCount++;\n typeAdded = true;\n }\n }\n });\n\n typeAdded = false;\n _forEach(refData.contributors, (item) => {\n if (item.type == 'reviewDirector') {\n directorArray.push(item);\n authorCount++;\n\n if (!typeAdded) {\n typeCount++;\n typeAdded = true;\n }\n }\n });\n\n typeAdded = false;\n _forEach(refData.contributors, (item) => {\n if (item.type == 'reviewWriterDirector') {\n writerDirectorArray.push(item);\n authorCount++;\n\n if (!typeAdded) {\n typeCount++;\n typeAdded = true;\n }\n }\n });\n\n typeAdded = false;\n _forEach(refData.contributors, (item) => {\n if (item.type == 'custom') {\n customArray.push(item);\n authorCount++;\n\n if (!typeAdded) {\n typeCount++;\n typeAdded = true;\n }\n }\n });\n\n //not sure how this would be possible to have contribs not in this list, but whatever\n if (authorCount == 0) {\n return '';\n }\n\n //now based off the total number we have to process, loop through all arrays at once and build the strings\n if (authorCount == 1) {\n //only one in one of these arrays\n if (writerArray.length == 1) {\n let thisName = shared.getReferenceName(writerArray[0]);\n let thisLabel = getLabelForContributorType(writerArray[0], false);\n let thisFullName = thisName + ', ' + thisLabel;\n\n authorPart = thisFullName;\n }\n\n if (directorArray.length == 1) {\n let thisName = shared.getReferenceName(directorArray[0]);\n let thisLabel = getLabelForContributorType(directorArray[0], false);\n let thisFullName = thisName + ', ' + thisLabel;\n\n authorPart = thisFullName;\n }\n\n if (writerDirectorArray.length == 1) {\n let thisName = shared.getReferenceName(writerDirectorArray[0]);\n let thisLabel = getLabelForContributorType(writerDirectorArray[0], false);\n let thisFullName = thisName + ', ' + thisLabel;\n\n authorPart = thisFullName;\n }\n\n if (customArray.length == 1) {\n let thisName = shared.getReferenceName(customArray[0]);\n let thisLabel = getLabelForContributorType(customArray[0], false);\n let thisFullName = thisName + ', ' + thisLabel;\n\n authorPart = thisFullName;\n }\n }\n\n //2-20\n if (authorCount > 1 && authorCount < 21) {\n let namesUsed = 0;\n \n //Writer\n writerArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ', ' + thisLabel;\n }\n\n namesUsed++;\n });\n\n if (writerArray.length > 0 && typeCount == 1) {\n let thisLabel = getLabelForContributorType(writerArray[0], true);\n authorPart = authorPart + ', ' + thisLabel;\n }\n\n //Director\n directorArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ', ' + thisLabel;\n }\n\n namesUsed++;\n });\n\n if (directorArray.length > 0 && typeCount == 1) {\n let thisLabel = getLabelForContributorType(directorArray[0], true);\n authorPart = authorPart + ', ' + thisLabel;\n }\n\n //Writers and Directors\n writerDirectorArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ', ' + thisLabel;\n }\n\n namesUsed++;\n });\n\n if (writerDirectorArray.length > 0 && typeCount == 1) {\n let thisLabel = getLabelForContributorType(writerDirectorArray[0], true);\n authorPart = authorPart + ', ' + thisLabel;\n }\n\n //Customs\n customArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ', ' + thisLabel;\n\n namesUsed++;\n });\n }\n\n //More Than Twenty\n if (authorCount > 20) {\n let namesUsed = 0;\n\n //Writers\n writerArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (namesUsed < 19) {\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n \n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ', ' + thisLabel;\n }\n \n namesUsed++;\n }\n else{\n if (namesUsed == authorCount - 1) {\n authorPart = authorPart + ',...'\n authorPart = authorPart + thisName;\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ', ' + thisLabel;\n }\n }\n }\n });\n \n if (writerArray.length > 0 && typeCount == 1 && (namesUsed < 19 || namesUsed == authorCount)) {\n let thisLabel = getLabelForContributorType(writerArray[0], true);\n authorPart = authorPart + ', ' + thisLabel;\n }\n \n //Directors\n directorArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (namesUsed < 19) {\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n \n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ', ' + thisLabel;\n }\n \n namesUsed++;\n }\n else{\n if (namesUsed == authorCount - 1) {\n authorPart = authorPart + ',...'\n authorPart = authorPart + thisName;\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ', ' + thisLabel;\n }\n }\n }\n });\n \n if (directorArray.length > 0 && typeCount == 1 && (namesUsed < 19 || namesUsed == authorCount)) {\n let thisLabel = getLabelForContributorType(directorArray[0], true);\n authorPart = authorPart + ', ' + thisLabel;\n }\n \n //Executive Directors and Producers\n writerDirectorArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (namesUsed < 19) {\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n \n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ', ' + thisLabel;\n }\n \n namesUsed++;\n }\n else{\n if (namesUsed == authorCount - 1) {\n authorPart = authorPart + ',...'\n authorPart = authorPart + thisName;\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ', ' + thisLabel;\n }\n }\n }\n });\n \n if (writerDirectorArray.length > 0 && typeCount == 1 && (namesUsed < 19 || namesUsed == authorCount)) {\n let thisLabel = getLabelForContributorType(writerDirectorArray[0], true);\n authorPart = authorPart + ', ' + thisLabel;\n }\n \n //Customs\n customArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (namesUsed < 19) {\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n \n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ', ' + thisLabel;\n }\n \n namesUsed++;\n }\n else{\n if (namesUsed == authorCount - 1) {\n authorPart = authorPart + ',...'\n authorPart = authorPart + thisName;\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ', ' + thisLabel;\n }\n }\n }\n });\n }\n \n return authorPart;\n}\n\nfunction getLabelForContributorType(contributor, isPlural){\n let label = '';\n let customLabel = '';\n\n switch (contributor.type) {\n case 'reviewEditor':\n if (isPlural) {\n label = 'Eds.'; \n }\n else{\n label = 'Ed.';\n }\n break;\n\n case 'reviewDirector':\n if (isPlural) {\n label = 'Dirs.'; \n }\n else{\n label = 'Dir.';\n }\n break;\n\n case 'reviewWriter':\n\n if (isPlural) {\n label = 'Writers'; \n }\n else{\n label = 'Writer';\n }\n break;\n\n case 'reviewWriterDirector':\n if (isPlural) {\n label = 'Writers & Dirs.'; \n }\n else{\n label = 'Writer & Dir.';\n }\n break;\n\n case 'reviewComposer':\n customLabel = shared.getStringValue(contributor.name);\n\n if (customLabel.length > 0) {\n label = customLabel;\n }\n break;\n \n default:\n //custom\n customLabel = shared.getStringValue(contributor.name);\n\n if (customLabel.length > 0) {\n label = customLabel;\n }\n break;\n }\n\n return label;\n}\n\nfunction appendNameSeperator(nameString, namesUsed, authorCount, isSecondary){\n\n isSecondary = true;\n \n //repetive logic I'm trying to re-use will all these different name types\n if (namesUsed == authorCount - 1) {\n\n //if three or more, add comma \n //or if the names are primary, then, add comma before any\n if (isSecondary && authorCount > 2) {\n nameString = nameString + ','\n }\n\n if (!isSecondary && authorCount > 1) {\n nameString = nameString + ','\n }\n\n nameString = nameString + ' & '\n }\n // else{\n\n // if (nameString.endsWith(',')) {\n // nameString = nameString + ' '\n // }\n // else{\n // nameString = nameString + ', '\n // }\n // }\n\n return nameString;\n}","const _forEach = require('lodash/forEach');\nconst dateHelper = require('../dateHelper');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReferenceNameString,\n getCitationAuthorString,\n getReferenceName,\n getCitationName,\n getReverseCitationName,\n getStringValue,\n getYear,\n getCitationLocationString,\n getPublisherString,\n getGroupPerformerString,\n getEditorsAtStartofRefString,\n getEditors,\n getChairs,\n getAuthors,\n getPerformers,\n getChapterTranslatorString,\n getTranslatorString,\n getNarratorString,\n getIllustratorString,\n getTranslators,\n getChapterTranslators,\n getEditorTranslatorString,\n getOriginalEditorString,\n getOriginalPublisherString,\n appendDOIURL,\n fixPageDash,\n getOrderByValue,\n getFullDate,\n getFullDateRange,\n formatRetrievalDate,\n getCitations,\n formatPageNumbers,\n stripSubtitle,\n getReverseCitationAuthorString,\n getReverseFullDate,\n fixEditionString,\n fixTitlePartClosure,\n isInteger,\n removingLeadingZeros,\n fixTimeCitationData,\n getOrdinalValue,\n addCommasToNumber,\n formatURL,\n limitWordsInString,\n removeEmptyContributors,\n getContributorsByType\n}\n\nfunction getContributorsByType(type, contributors, matchSimilarTypes){\n let typeContribs = [];\n\n if (typeof contributors == 'undefined'){\n return typeContribs;\n }\n\n //sometimes we will want to grab all authors, users, group authors, etc as the same, sometimes we won't\n if (typeof matchSimilarTypes == 'undefined'){\n matchSimilarTypes = true;\n }\n\n _forEach(contributors, (item) => {\n if (item.type == type) {\n typeContribs.push(item);\n }\n\n if (matchSimilarTypes) {\n //for authors. we also need to group in Group Authors and Usernames\n if (type == 'author') {\n if (item.type == 'groupAuthor' || item.type == 'userName' || item.type == 'chapterAuthor') {\n typeContribs.push(item);\n }\n }\n\n if (type == 'groupAuthor') {\n if (item.type == 'author' || item.type == 'userName' || item.type == 'chapterAuthor') {\n typeContribs.push(item);\n }\n }\n\n if (type == 'userName') {\n if (item.type == 'groupAuthor' || item.type == 'author' || item.type == 'chapterAuthor') {\n typeContribs.push(item);\n }\n }\n\n if (type == 'chapterAuthor') {\n if (item.type == 'groupAuthor' || item.type == 'author' || item.type == 'userName') {\n typeContribs.push(item);\n }\n }\n }\n\n });\n\n return typeContribs;\n}\n\nfunction getOrderByValue(referenceValue){\n\n if (referenceValue == '') {\n return '';\n }\n\n let orderByValue = referenceValue;\n \n //before we remove any tags, replace anything within italics and is a number with text\n //22 searches for Sasquatch\n //twenty two searches for Sasquatch\n\n var words = orderByValue.split(\" \");\n let inItalics = false;\n for (var i = 0; i < words.length; i += 1) {\n if (words[i].startsWith('')) {\n inItalics = true;\n words[i] = words[i].replace('', '');\n }\n\n if (inItalics) {\n words[i] = words[i].replace(':', '');\n words[i] = convertNumberToText(words[i]);\n }\n\n if (words[i].endsWith('')) {\n inItalics = false;\n words[i] = words[i].replace('', '');\n }\n }\n\n orderByValue = words.join(' ');\n\n //now split back out and remove anything in brackets (like user names)\n words = orderByValue.split(\" \");\n let bracketlessArray = [];\n let inBrackets = false;\n\n for (var i = 0; i < words.length; i += 1) {\n\n if (i > 0) {\n if (words[i].startsWith('[')) {\n inBrackets = true;\n } \n }\n \n if (inBrackets === false) {\n bracketlessArray.push(words[i]);\n }\n\n if (i > 0) {\n if (words[i].endsWith(']') || words[i].endsWith('].')) {\n inBrackets = false;\n }\n }\n }\n\n orderByValue = bracketlessArray.join(' ');\n\n orderByValue = removeTags(orderByValue);\n\n //we need to parse the date from the value and convert it to sortable\n //IE: 2020, March 15 to 2020 03 15\n var array = orderByValue.split(\".\");\n\n for (i = 0; i < array.length; i++) {\n\n if (array[i].startsWith(' (') && array[i].endsWith(')')) {\n array[i] = array[i].split(\"(\").join(\"\");\n array[i] = array[i].split(\")\").join(\"\");\n\n //if the array is just a year, then append 00 00\n if (array[i].length == 5) {\n if (isInteger(array[i])) {\n array[i] = array[i] + ' 00 00';\n }\n }\n\n //if this section has a month only, we need to add a 00 for the sort after ut\n if (array[i].endsWith('January') || array[i].endsWith('February') || array[i].endsWith('March') ||\n array[i].endsWith('April') || array[i].endsWith('May') || array[i].endsWith('June') || \n array[i].endsWith('July') || array[i].endsWith('August') || array[i].endsWith('September') || \n array[i].endsWith('October') || array[i].endsWith('November') || array[i].endsWith('December')) {\n array[i] = array[i] + ' 00';\n }\n\n //replace any months with digits for sorting\n array[i] = array[i].replace('January', '01');\n array[i] = array[i].replace('February', '02');\n array[i] = array[i].replace('March', '03');\n array[i] = array[i].replace('April', '04');\n array[i] = array[i].replace('May', '05');\n array[i] = array[i].replace('June', '06');\n array[i] = array[i].replace('July', '07');\n array[i] = array[i].replace('August', '08');\n array[i] = array[i].replace('September', '09');\n array[i] = array[i].replace('October', '10');\n array[i] = array[i].replace('November', '11');\n array[i] = array[i].replace('December', '12');\n\n let dateArray = array[i].split(' ');\n\n //if we have a date, make sure to pad it with a 0\n //March 6 1978 should be 1978 03 06\n if (dateArray.length > 3) {\n if (dateArray[3].length == 1) {\n dateArray[3] = '0' + dateArray[3];\n array[i] = dateArray.join(' ');\n }\n }\n }\n\n }\n\n orderByValue = array.join('.');\n orderByValue = orderByValue.split(\". \").join(\" \");\n\n if (orderByValue.endsWith('.')) {\n orderByValue = orderByValue.substring(0, orderByValue.length - 1);\n }\n\n orderByValue = orderByValue.split(\"(enacted)\").join(\"\");\n orderByValue = orderByValue.split(\"(Reprinted from\").join(\"\");\n orderByValue = orderByValue.split(\"(Director)\").join(\"\");\n orderByValue = orderByValue.split(\"(Original work published \").join(\"\");\n orderByValue = orderByValue.split(\"(Retraction published \").join(\"\");\n orderByValue = orderByValue.split(\"(Host)\").join(\"\");\n orderByValue = orderByValue.split(\"(Hosts)\").join(\"\");\n orderByValue = orderByValue.split(\"(Executive Producer)\").join(\"\");\n orderByValue = orderByValue.split(\"(Executive Producers)\").join(\"\");\n orderByValue = orderByValue.split(\"(Ed.)\").join(\"\");\n orderByValue = orderByValue.split(\"(Eds.)\").join(\"\");\n orderByValue = orderByValue.split(\"Ed. & Trans.\").join(\"\");\n orderByValue = orderByValue.split(\", Trans.\").join(\" \");\n\n orderByValue = orderByValue.split(\".,\").join(\"\");\n orderByValue = orderByValue.split(\",\").join(\"\");\n orderByValue = orderByValue.split(\"[\").join(\"\");\n orderByValue = orderByValue.split(\"]\").join(\"\");\n orderByValue = orderByValue.split(\"(\").join(\" \");\n orderByValue = orderByValue.split(\")\").join(\" \");\n orderByValue = orderByValue.split(String.fromCharCode(34)).join(\"\"); //double quotes\n orderByValue = orderByValue.split(\"“\").join(\"\");\n orderByValue = orderByValue.split(\"”\").join(\"\");\n orderByValue = orderByValue.split(\"”\").join(\"\");\n orderByValue = orderByValue.split(\": \").join(\" \");\n orderByValue = orderByValue.split(\" n.d. \").join(\" 0000 \");\n orderByValue = orderByValue.split(\" n.d.-\").join(\" 0000\");\n orderByValue = orderByValue.split(\" in press \").join(\" 9999 \");\n orderByValue = orderByValue.split(\" in press-\").join(\" 9999\");\n orderByValue = orderByValue.split(\" \").join(\" \");\n orderByValue = orderByValue.split(\". & \").join(\" \");\n orderByValue = orderByValue.split(\" & \").join(\" \");\n\n //replace special characters with their equivalent values\n orderByValue = orderByValue.split(\"é\").join(\"e\");\n orderByValue = orderByValue.split(\"á\").join(\"a\");\n orderByValue = orderByValue.split(\"ú\").join(\"u\");\n orderByValue = orderByValue.split(\"í\").join(\"i\");\n orderByValue = orderByValue.split(\"ó\").join(\"o\");\n orderByValue = orderByValue.split(\"ñ\").join(\"n\");\n orderByValue = orderByValue.split(\"ü\").join(\"u\");\n orderByValue = orderByValue.split(\"ö\").join(\"o\");\n orderByValue = orderByValue.split(\"ä\").join(\"a\");\n orderByValue = orderByValue.split(\"ç\").join(\"c\");\n \n orderByValue = orderByValue.trim();\n \n\treturn orderByValue.toLowerCase();\n}\n\nfunction getReferenceNameString(contributors, isSecondary){\n var contributorstring = '';\n\n if (typeof contributors === 'undefined') {\n return contributorstring;\n }\n\n contributors = removeEmptyContributors(contributors);\n\n if (contributors.length > 0) {\n\n //Single\n if (contributors.length == 1) {\n contributorstring = getReferenceName(contributors[0]);\n }\n\n //2-20\n if (contributors.length > 1 && contributors.length < 21) {\n var counter = 0;\n\n\t\t\t_forEach(contributors, (item) => {\n if (counter > 0) {\n\n if (counter == contributors.length - 1) {\n\n if (contributors.length == 2 && contributors[0].type == 'groupAuthor' && !isSecondary) {\n contributorstring = contributorstring + ' & '\n }\n else{\n contributorstring = contributorstring + ', & '\n }\n }\n else{\n contributorstring = contributorstring + ', '\n }\n }\n\n contributorstring = contributorstring + getReferenceName(item);\n\n counter++;\n });\n }\n\n //More Than Twenty\n if (contributors.length > 20) {\n var counter = 0;\n\n _forEach(contributors, (item) => {\n\n if (counter < 19) {\n if (counter > 0) {\n contributorstring = contributorstring + ', ' \n }\n contributorstring = contributorstring + getReferenceName(item);\n }\n else{\n if (counter == contributors.length - 1) {\n contributorstring = contributorstring + ',...'\n contributorstring = contributorstring + getReferenceName(item);\n }\n }\n counter++;\n });\n }\n }\n\n if (isSecondary && contributors.length == 2) {\n contributorstring = contributorstring.replace(', &', ' &');\n }\n \n return contributorstring;\n}\n\nfunction getEditorsAtStartofRefString(editors){\n var editorString = '';\n\n editors = removeEmptyContributors(editors);\n\n if (editors.length > 0) {\n\n //Single\n if (editors.length == 1) {\n editorString = getEditorAtStartString(editors[0]);\n }\n\n //2-20\n if (editors.length > 1 && editors.length < 21) {\n var counter = 0;\n\n editors.forEach(item => {\n\n if (counter > 0) {\n\n if (counter == editors.length - 1) {\n editorString = editorString + ', & '\n }\n else{\n editorString = editorString + ', '\n }\n }\n\n editorString = editorString + getEditorAtStartString(item);\n\n counter++;\n });\n }\n\n //More Than Twenty\n if (editors.length > 20) {\n var counter = 0;\n\n editors.forEach(item => {\n\n if (counter < 19) {\n if (counter > 0) {\n editorString = editorString + ', ' \n }\n editorString = editorString + getEditorAtStartString(item);\n }\n else{\n if (counter == editors.length - 1) {\n editorString = editorString + ',...'\n editorString = editorString + getEditorAtStartString(item);\n }\n }\n counter++;\n });\n }\n }\n \n return editorString;\n}\n\nfunction getEditors(contributors){\n let editorArray = [];\n\n if (typeof contributors === 'undefined') {\n return editorArray;\n }\n\n contributors = removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'editor') {\n editorArray.push(item);\n }\n });\n\n return editorArray;\n}\n\nfunction getChairs(contributors){\n let chairArray = [];\n\n if (typeof contributors === 'undefined') {\n return chairArray;\n }\n\n contributors = removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'chair') {\n chairArray.push(item);\n }\n });\n\n return chairArray;\n}\n\nfunction getTranslators(contributors){\n let translatorArray = [];\n\n contributors = removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'translator') {\n translatorArray.push(item);\n }\n });\n\n return translatorArray;\n}\n\nfunction getChapterTranslators(contributors){\n let translatorArray = [];\n\n contributors = removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'chapterTranslator') {\n translatorArray.push(item);\n }\n });\n\n return translatorArray;\n}\n\nfunction getAuthors(contributors){\n let authorArray = [];\n\n if (typeof contributors === 'undefined') {\n return authorArray;\n }\n\n contributors = removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'author' || item.type == 'userName' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'director') {\n authorArray.push(item);\n }\n });\n\n return authorArray;\n}\n\nfunction getPerformers(contributors){\n let performerArray = [];\n\n if (typeof contributors === 'undefined') {\n return performerArray;\n }\n contributors = removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'performer') {\n performerArray.push(item);\n }\n });\n\n return performerArray;\n}\n\nfunction getEditorAtStartString(contributor){\n var name = '';\n\n if (contributor.lastName && contributor.lastName.trim().length > 0) {\n name = contributor.lastName.trim();\n }\n\n if (contributor.firstName && contributor.firstName.trim().length > 0) {\n if (name.length > 0) {\n name = name + \", \";\n }\n\n name = name + contributor.firstName.getInitial()\n }\n\n if (contributor.middleName && contributor.middleName.trim().length > 0) {\n\n if (name.length > 0) {\n if (contributor.firstName.trim().length == 0) {\n name = name + \", \";\n }\n else{\n name = name + \" \";\n }\n }\n\n name = name + contributor.middleName.getInitial();\n }\n\n if (contributor.suffix && contributor.suffix.trim().length > 0) {\n name = name + ', ' + contributor.suffix.trim();\n }\n\n return name;\n}\n\nfunction getCitationAuthorString(authors, isSubsequent, paperRefs){\n var authorString = '';\n\n authors = removeEmptyContributors(authors);\n\n //if there are multiple references with this author last name in the paper, we need to include the \n\n if (authors.length > 0) {\n //1: LastName\n if (authors.length == 1) {\n authorString = getCitationName(authors[0], isSubsequent, paperRefs);\n }\n\n //2: LastName & LastName\n if (authors.length == 2) {\n authorString = getCitationName(authors[0], isSubsequent, paperRefs) + ' & ' + getCitationName(authors[1], isSubsequent, paperRefs);\n }\n\n //More than 4 = LastName, et al.\n if (authors.length > 2) {\n authorString = getCitationName(authors[0], isSubsequent, paperRefs) + ' et al.';\n }\n }\n \n return authorString;\n}\n\nfunction getReverseCitationAuthorString(authors){\n var authorString = '';\n\n authors = removeEmptyContributors(authors);\n\n if (authors.length > 0) {\n //1: A. A. Authora\n if (authors.length == 1) {\n authorString = getReverseCitationName(authors[0]);\n }\n\n //2: LastName & LastName = A. A. Authora & B. B. Authorb Jr.\n if (authors.length == 2) {\n authorString = getReverseCitationName(authors[0]) + ' & ' + getReverseCitationName(authors[1]);\n }\n\n //More than 2 = A. A. Authora et al.\n if (authors.length > 2) {\n authorString = getReverseCitationName(authors[0]) + ' et al.';\n }\n }\n \n return authorString;\n}\n\nfunction getPublisherString(publishers){\n let publisherString = '';\n\n if (typeof publishers == 'undefined'){\n return '';\n }\n \n //filter these for type: reference\n let refPublishers = [];\n\n publishers.forEach(item => {\n if (item.type == 'reference' && item.name.length > 0) {\n refPublishers.push(item);\n }\n });\n\n publishers = removeEmptyPublishers(publishers);\n\n //1 Publisher\n if (refPublishers.length == 1) {\n\n if (refPublishers[0].name.endsWith('.')) {\n return refPublishers[0].name;\n }\n else{\n return refPublishers[0].name + '.';\n }\n }\n\n //More than 1\n if (refPublishers.length > 1) {\n \n var counter = 0;\n refPublishers.forEach(item => {\n if (counter > 0) {\n publisherString = publisherString + '; ';\n }\n\n publisherString = publisherString + item.name;\n \n counter++;\n });\n\n if (!publisherString.endsWith(\".\")) {\n publisherString = publisherString + '.'\n }\n }\n \n return publisherString;\n}\n\nfunction getGroupPerformerString(contributors){\n let performerString = '';\n let performersArray = [];\n\n contributors = removeEmptyContributors(contributors);\n \n _forEach(contributors, (item) => {\n if (item.type == 'groupPerformer') {\n performersArray.push(item);\n }\n });\n \n //1 Performer\n if (performersArray.length == 1) {\n return performersArray[0].groupName;\n }\n\n //More than 1\n if (performersArray.length > 1) {\n \n var counter = 0;\n performersArray.forEach(item => {\n if (counter > 0) {\n\n if (counter == performersArray.length - 1) {\n performerString = performerString + ' & ';\n }\n else{\n performerString = performerString + ', ';\n }\n }\n\n performerString = performerString + item.groupName;\n \n counter++;\n });\n }\n \n return performerString;\n}\n\nfunction getOriginalPublisherString(publishers){\n let publisherString = '';\n\n let originalPublisherArray = [];\n \n publishers.forEach(item => {\n if (item.type == 'original') {\n originalPublisherArray.push(item);\n }\n });\n \n //1 Publisher\n if (originalPublisherArray.length == 1) {\n return originalPublisherArray[0].name;\n }\n\n //More than 1\n if (originalPublisherArray.length > 1) {\n \n var counter = 0;\n originalPublisherArray.forEach(item => {\n if (counter > 0) {\n publisherString = publisherString + '; ';\n }\n\n publisherString = publisherString + item.name;\n \n counter++;\n });\n }\n \n return publisherString;\n}\n\nfunction getTranslatorString(contributors){\n let translatorArray = [];\n let translatorString = '';\n\n if (typeof contributors === 'undefined') {\n return translatorArray;\n }\n\n contributors = removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'translator') {\n translatorArray.push(item);\n }\n });\n\n if (translatorArray.length > 0) {\n translatorString = getReferenceNameString(translatorArray, true);\n translatorString = translatorString + ', Trans.';\n }\n\n return translatorString;\n}\n\nfunction getChapterTranslatorString(contributors){\n let translatorArray = [];\n let translatorString = '';\n\n if (typeof contributors === 'undefined') {\n return translatorArray;\n }\n\n contributors = removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'chapterTranslator') {\n translatorArray.push(item);\n }\n });\n\n if (translatorArray.length > 0) {\n translatorString = getReferenceNameString(translatorArray, true);\n translatorString = translatorString + ', Trans.';\n }\n\n return translatorString;\n}\n\nfunction getOriginalEditorString(contributors){\n let originalEditorArray = [];\n let originalEditorString = '';\n\n if (typeof contributors === 'undefined') {\n return originalEditorString;\n }\n\n contributors = removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'originalEditor') {\n originalEditorArray.push(item);\n }\n });\n\n if (originalEditorArray.length > 0) {\n originalEditorString = getReferenceNameString(originalEditorArray, true);\n\n\n if (originalEditorArray.length == 1) {\n originalEditorString = originalEditorString + ', Ed.';\n }\n else{\n originalEditorString = originalEditorString + ', Eds.';\n }\n \n }\n\n return originalEditorString;\n}\n\nfunction getNarratorString(contributors){\n let narratorArray = [];\n let narratorString = '';\n\n if (typeof contributors === 'undefined') {\n return narratorString;\n }\n\n contributors = removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'narrator') {\n narratorArray.push(item);\n }\n });\n\n if (narratorArray.length > 0) {\n narratorString = getReferenceNameString(narratorArray, true);\n narratorString = narratorString + ', ';\n\n if (narratorArray.length == 1) {\n narratorString = narratorString + 'Narr.';\n }\n else{\n narratorString = narratorString + 'Narrs.';\n }\n }\n\n return narratorString;\n}\n\nfunction getIllustratorString(contributors){\n let illustratorArray = [];\n let illustratorString = '';\n\n if (typeof contributors === 'undefined') {\n return illustratorString;\n }\n\n contributors = removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'illustrator') {\n illustratorArray.push(item);\n }\n });\n\n if (illustratorArray.length > 0) {\n illustratorString = getReferenceNameString(illustratorArray, true);\n illustratorString = illustratorString + ', ';\n\n if (illustratorArray.length == 1) {\n illustratorString = illustratorString + 'Ill.';\n }\n else{\n illustratorString = illustratorString + 'Ills.';\n }\n }\n\n return illustratorString;\n}\n\nfunction getReferenceName(contributor){\n var name = '';\n\n switch (contributor.type) {\n case 'author':\n case 'chapterAuthor':\n case 'custom':\n case 'executiveProducer':\n case 'executiveDirector':\n case 'executiveDirectorProducer':\n case 'director':\n case 'writer':\n case 'writerDirector':\n case 'host':\n case 'interview':\n \tif(contributor.lastName){\n\t\t\t\tif (contributor.lastName.trim().length == 0) {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tname = contributor.lastName.trim(); \n\t\t\t\t}\n\t\t\t}\n\n if (contributor.firstName && contributor.firstName.trim().length > 0) {\n name = name + ', ' + contributor.firstName.getInitial();\n }\n\n\t\t\tif (contributor.middleName && contributor.middleName.trim().length > 0) {\n\n if (isSpecialMiddleName(contributor.middleName)) {\n name = name + ' ' + contributor.middleName;\n }\n else{\n contributor.middleName = contributor.middleName.trim();\n\n if (contributor.middleName.includes(\" \")) {\n let middleArray = contributor.middleName.split(\" \");\n let middleInitial = \"\";\n \n for (var i = 0; i < middleArray.length; i++) {\n if (middleInitial.length > 0) {\n middleInitial = middleInitial + \" \";\n }\n\n middleInitial = middleInitial + middleArray[i].getInitial();\n }\n\n name = name + ' ' + middleInitial;\n }\n else{\n name = name + ' ' + contributor.middleName.getInitial();\n }\n }\n }\n\n if (contributor.suffix && contributor.suffix.trim().length > 0) {\n name = name + ', ' + contributor.suffix.trim();\n }\n\n break;\n case 'editor':\n case 'chapterTranslator':\n case 'translator':\n case 'narrator':\n case 'illustrator':\n case 'originalEditor':\n case 'performer':\n case 'chair':\n case 'reviewAuthor':\n case 'reviewDirector':\n case 'reviewWriter':\n case 'reviewWriterDirector':\n case 'reviewArtist':\n case 'reviewComposer':\n case 'reviewEditor':\n case 'volumeEditor':\n \n if (contributor.firstName && contributor.firstName.trim().length > 0) {\n name = contributor.firstName.getInitial();\n }\n \n if (contributor.middleName && contributor.middleName.trim().length > 0) {\n name = name + ' ' + contributor.middleName.getInitial();\n }\n\n if (contributor.lastName && contributor.lastName.trim().length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n \n name = name + contributor.lastName.trim();\n }\n\n var suffix = '';\n if (contributor.suffix && contributor.suffix.trim().length > 0) {\n suffix = contributor.suffix.trim();\n }\n\n if (suffix.length > 0) {\n name = name + ' ' + suffix;\n\n if (!name.endsWith(\".\")) {\n name = name + '.'\n }\n }\n\n if (contributor.type == 'reviewEditor') {\n name = name + ', Ed.'\n }\n\n break;\n case 'userName':\n\n let firstInitial ='';\n if (contributor.firstName.trim().length > 0) {\n firstInitial = contributor.firstName.getInitial();\n }\n\n let middleInitial = '';\n if (contributor.middleName && contributor.middleName.trim().length > 0) {\n middleInitial = contributor.middleName.getInitial();\n }\n\n let lastName = '';\n if (contributor.lastName && contributor.lastName.trim().length > 0) {\n lastName = contributor.lastName.trim();\n }\n\n var suffix = '';\n if (contributor.suffix && contributor.suffix.trim().length > 0) {\n suffix = contributor.suffix.trim();\n }\n\n let userName = '';\n \n if (contributor.name) {\n userName = contributor.name.trim();\n }\n \n //see if we have username only\n if (firstInitial.length == 0 &&\n middleInitial.length == 0 &&\n lastName.length == 0) {\n \n name = userName;\n }\n else{\n name = lastName;\n\n if (firstInitial.length > 0) {\n name = name + ', ' + firstInitial;\n }\n\n if (middleInitial.length > 0) {\n name = name + ' ' + middleInitial;\n }\n\n if (suffix.length > 0) {\n name = name + ', ' + suffix\n }\n\n if (userName.length > 0) {\n name = name + ' [' + userName + ']';\n }\n }\n break;\n case 'groupAuthor':\n case 'reviewGroupArtist':\n if(contributor.groupName){\n\t\t\t\tname = contributor.groupName.trim();\n }\n \n let contributorname = getStringValue(contributor.name);\n \n if (contributorname.length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n\n name = name + '[' + contributorname + ']';\n }\n\n break;\n case 'testimony':\n \n if(contributor.firstName){\n name = contributor.firstName.trim();\n }\n\n if(contributor.lastName){\n\n if (contributor.lastName.trim().length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n \n name = name + contributor.lastName.trim(); \n }\n }\n\n break;\n }\n\n return name;\n}\n\nfunction getCitationName(contributor, isSubsequent, paperRefs){\n var name = '';\n\n switch (contributor.type) {\n case 'author':\n case 'editor':\n case 'chapterAuthor':\n case 'custom':\n case 'executiveProducer':\n case 'executiveDirector':\n case 'executiveDirectorProducer':\n case 'director':\n case 'writer':\n case 'writerDirector':\n case 'host':\n case 'interview':\n\n //see if we need to check for other references with this author's surname\n if (paperRefs != null) {\n let contribCount = 0;\n\n let firstInitial ='';\n if (contributor.firstName.trim().length > 0) {\n firstInitial = contributor.firstName.getInitial();\n }\n\n //check each reference\n paperRefs.forEach(thisReference => {\n if (typeof thisReference.data.contributors != 'undefined') {\n\n let foundForThisRef = false;\n \n\t\t\t\t\t\t//check each contrib on the ref until we find a matching\n\t\t\t\t\t\t_forEach(thisReference.data.contributors, (thisContributor) => {\n let thisContribFirstInitial ='';\n if (thisContributor.firstName.trim().length > 0) {\n thisContribFirstInitial = thisContributor.firstName.getInitial();\n }\n\n if (thisContributor.lastName == contributor.lastName && thisContribFirstInitial != firstInitial) {\n\n if (!foundForThisRef) {\n contribCount++;\n }\n\n foundForThisRef = true;\n }\n });\n }\n });\n\n if (contribCount > 0) {\n //we found multiple contribs with the same last name, add first initial\n if (firstInitial != '') {\n name = firstInitial + ' ';\n }\n\n name = name + contributor.lastName.trim();\n }\n else{\n name = contributor.lastName.trim();\n }\n }\n else{\n name = contributor.lastName.trim();\n }\n break;\n case 'userName':\n\n if (contributor.lastName.trim().length > 0) {\n name = contributor.lastName.trim();\n }\n else{\n name = contributor.name.trim();\n }\n break;\n case 'groupAuthor':\n\n var abbreviation = getStringValue(contributor.abbreviation);\n\n if (isSubsequent) {\n if (abbreviation.length > 0) {\n name = abbreviation;\n }\n else{\n name = getStringValue(contributor.groupName).trim()\n }\n }\n else{\n name = getStringValue(contributor.groupName).trim();\n\n if (abbreviation.length > 0) {\n name = name + ' [' + abbreviation + ']';\n }\n }\n\n break;\n case 'translator':\n name = contributor.lastName.trim();\n break;\n }\n\n return name;\n}\n\nfunction getReverseCitationName(contributor, isSubsequent){\n var name = '';\n\n switch (contributor.type) {\n case 'author':\n case 'editor':\n case 'chapterAuthor':\n case 'executiveProducer':\n case 'executiveDirector':\n case 'executiveDirectorProducer':\n // name = contributor.lastName.trim();\n //B. B. Authorb Jr.\n \n let firstInitial ='';\n if (contributor.firstName.trim().length > 0) {\n firstInitial = contributor.firstName.getInitial();\n }\n\n let middleInitial = '';\n if (contributor.middleName && contributor.middleName.trim().length > 0) {\n middleInitial = contributor.middleName.getInitial();\n }\n\n let lastName = '';\n if (contributor.lastName && contributor.lastName.trim().length > 0) {\n lastName = contributor.lastName.trim();\n }\n\n var suffix = '';\n if (contributor.suffix && contributor.suffix.trim().length > 0) {\n suffix = contributor.suffix.trim();\n }\n\n name = '';\n\n if (firstInitial.length > 0) {\n name = firstInitial;\n }\n\n if (middleInitial.length > 0) {\n\n if (name.length > 0) {\n name = name + ' ';\n }\n\n name = name + middleInitial;\n }\n\n if (lastName.length > 0) {\n\n if (name.length > 0) {\n name = name + ' ';\n }\n\n name = name + lastName;\n }\n\n if (suffix.length > 0) {\n\n if (name.length > 0) {\n name = name + ' ';\n }\n\n name = name + suffix\n }\n\n break;\n case 'userName':\n\t\t\tif(contributor.lastName){\n\t\t\t\tif (contributor.lastName.trim().length > 0) {\n\t\t\t\t\tname = contributor.lastName.trim();\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tname = contributor.name.trim();\n\t\t\t\t}\n\t\t\t}\n break;\n case 'groupAuthor':\n\n var abbreviation = getStringValue(contributor.abbreviation);\n\n if (isSubsequent) {\n if (abbreviation.length > 0) {\n name = abbreviation;\n }\n else{\n name = contributor.groupName.trim()\n }\n }\n else{\n name = contributor.groupName.trim();\n\n if (abbreviation.length > 0) {\n name = name + ' [' + abbreviation + ']';\n }\n }\n\n break;\n case 'translator':\n name = contributor.lastName.trim();\n break;\n }\n\n return name;\n}\n\nfunction getYear(date){\n var year = '';\n\n if (typeof date == 'undefined'){\n return '';\n }\n\n if (date == '') {\n return year;\n }\n\n //see if there are any valid prefixes or suffixes on this date\n let prefix = '';\n let suffix = '';\n let errorConverting = false;\n\n if (date.toLowerCase().startsWith('ca.')) {\n prefix = 'ca.';\n }\n\n if (date.toLowerCase().startsWith('c.')) {\n prefix = 'c.';\n }\n\n //see if the format is either 2019 or 2/2/2019\n if (date.includes(\"/\")) {\n //split into an array and grab the last entry in that array\n var array = date.split(\"/\");\n\n // 2018/2020 needs to return as 2018-2020\n if (array.length == 2) {\n if (array[0].length == 4 && array[1].length == 4) {\n return array[0] + '–' + array[1];\n }\n else{\n //handle case of May/June 2019\n if (array[1].includes(\" \")) {\n var yearArray = array[1].split(\" \");\n\n return yearArray[yearArray.length - 1];\n }\n }\n }\n\n year = array[array.length-1]\n }\n else{\n if (date.length > 4) {\n\n //2018-2020\n if (date.includes(\"-\") || date.includes(\"–\")) {\n year = date;\n }\n else {\n try {\n year = dateHelper.format(date, \"yyyy\");\n }\n catch(err) {\n errorConverting = true;\n console.log('Failed to convert year of ' + date);\n // console.log(err);\n year = date;\n }\n }\n }\n else {\n //assume this is only a year\n year = date;\n }\n }\n\n if (prefix.length > 0 && !errorConverting) {\n\n if (prefix.length > 0 && year.length == 0) {\n year = date;\n }else{\n year = prefix + ' ' + year;\n }\n }\n\n //if this is a span, then run page dash logic\n year = fixPageDash(year);\n \n return year;\n }\n\nfunction getStringValue(input){\n var output = '';\n\n //helper to check for mull values\n if (typeof input !== 'undefined'){\n output = input.trim();\n }\n \n return output;\n}\n\nfunction getCitationLocationString(citationData){\n var location = '';\n\n let citationVolume = getCitationVolume(citationData);\n\n if (citationData.value == '' && citationData.type != 'actSceneLine' && citationVolume.length == 0) {\n return '';\n }\n\n switch (citationData.type) {\n case 'notdirect':\n location = '';\n break;\n case 'page':\n\n var label = 'p.';\n\n if (usePluralLabel(citationData.value) && !citationData.value.includes(':')) {\n label = 'pp.'\n }\n\n location = label + ' ' + fixPageDash(citationData.value);\n\n if (citationVolume.length > 0) {\n\n if (citationData.value.length == 0) {\n location = 'vol. ' + citationVolume;\n }else{\n location = 'vol. ' + citationVolume + ', ' + location;\n }\n }\n\n break;\n case 'paragraph':\n var label = 'para.';\n\n if (usePluralLabel(citationData.value)) {\n label = 'paras.'\n }\n\n location = label + ' ' + citationData.value;\n break;\n case 'chapter':\n location = 'Chapter ' + citationData.value;\n break;\n case 'track':\n location = 'Track ' + citationData.value;\n break;\n case 'figure':\n var label = 'Figure';\n \n if (usePluralLabel(citationData.value)) {\n label = 'Figures'\n }\n\n location = label + ' ' + citationData.value;\n break;\n case 'table':\n var label = 'Table';\n\n if (usePluralLabel(citationData.value)) {\n label = 'Tables'\n }\n\n location = label + ' ' + citationData.value;\n break;\n case 'time':\n\n if (citationData.value.startsWith('/')) {\n citationData.value = citationData.value.substring(1, citationData.value.length);\n }\n\n location = citationData.value;\n break;\n case 'section':\n\n if (isInteger(citationData.value)) {\n location = 'section ' + citationData.value;\n }\n else{\n location = citationData.value + ' section';\n }\n break;\n case 'actSceneLine':\n location = fixPageDash(citationData.value);\n location = location.split(\"/\").join(\".\");\n\n if (location.endsWith('.')) {\n location = location.substring(0, location.length - 1);\n }\n\n break;\n case 'other':\n case 'religious':\n \n location = citationData.label;\n\n if (citationData.label.length > 0) {\n location = location + ' ';\n }\n location = location + citationData.value;\n \n break;\n }\n\n return location;\n}\n\nfunction getEditorTranslatorString(contributors){\n\n let editorTranslatorString = '';\n let editorArray = [];\n\n if (typeof contributors === 'undefined') {\n return editorArray;\n }\n\n contributors = removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'editor') {\n editorArray.push(item);\n }\n });\n\n let translatorArray = [];\n\n _forEach(contributors, (item) => {\n if (item.type == 'translator') {\n translatorArray.push(item);\n }\n });\n\n if (editorArray.length > 0 &&\n (editorArray.length == translatorArray.length)) {\n \n let same = true;\n\n //gonna loop each array and see if we have a match\n editorArray.forEach(thisEditor =>{\n \n var found = false;\n\n translatorArray.forEach(thisTranslator =>{\n if (thisEditor.firstName == thisTranslator.firstName &&\n thisEditor.middleName == thisTranslator.middleName &&\n thisEditor.lastName == thisTranslator.lastName &&\n thisEditor.prefix == thisTranslator.prefix &&\n thisEditor.suffix == thisTranslator.suffix) {\n found = true;\n } \n });\n\n if (found == false) {\n same = false;\n }\n });\n\n if (same) {\n //they match, build the combined string\n editorTranslatorString = getReferenceNameString(translatorArray, true);\n editorTranslatorString = editorTranslatorString + ', Ed. & Trans.';\n }\n }\n\n return editorTranslatorString;\n}\n\nfunction appendDOIURL(doi){\n let url = '';\n\n if (doi.length > 0) {\n if (!doi.startsWith('https://doi.org/') && !doi.startsWith('http://doi.org/') ) {\n\n //in case they enter a URL in the DOI\n if ((doi.startsWith('https:') || doi.startsWith('http:'))) {\n\n if (doi.startsWith('https://dx.doi.org/') || doi.startsWith('http://dx.doi.org/')) {\n doi = doi.replace('https://dx.doi.org/', '');\n doi = doi.replace('http://dx.doi.org/', '');\n\n url = 'https://doi.org/' + doi;\n }else{\n return formatURL(doi);\n }\n }\n else{\n //if they happen to start this with dx.doi.org, pull that out\n \n doi = doi.replace('dx.doi.org/', '');\n doi = doi.replace('doi.org/', '');\n\n url = 'https://doi.org/' + doi;\n }\n }\n else{\n url = doi;\n }\n\n url = formatURL(url);\n }\n\n return url;\n}\n\nfunction fixPageDash(pages){\n \n let cleanPages = ''\n\n cleanPages = pages.replace('-', '–');\n cleanPages = cleanPages.replace(' - ', '–');\n cleanPages = cleanPages.replace(' – ', '–');\n\n return cleanPages;\n}\n\nfunction usePluralLabel(value){\n let use = false;\n\n if (value.includes('-') || \n value.includes(':') ||\n value.includes('–') ||\n value.includes(',')) {\n \n use = true;\n }\n\n return use;\n}\n\nfunction formatPageNumbers(pages){\n if (pages.length > 0) {\n var label = 'p.';\n if (pages.includes('-') || pages.includes('–')) {\n label = 'pp.';\n }\n\n pages = label + ' ' + fixPageDash(pages);\n }\n\n return pages;\n}\n\nfunction isInteger(value) {\nreturn !isNaN(value) && \n parseInt(Number(value)) == value && \n !isNaN(parseInt(value, 10));\n}\nfunction convertNumberToText (num) {\n\n var th = ['','thousand','million', 'billion','trillion'];\n var dg = ['zero','one','two','three','four', 'five','six','seven','eight','nine'];\n var tn = ['ten','eleven','twelve','thirteen', 'fourteen','fifteen','sixteen', 'seventeen','eighteen','nineteen'];\n var tw = ['twenty','thirty','forty','fifty', 'sixty','seventy','eighty','ninety'];\n\n num = num.toString();\n num = num.replace(/[\\, ]/g,'');\n if (num != parseFloat(num)) return num;\n var x = num.indexOf('.');\n \n if (x == -1)\n x = num.length;\n \n if (x > 15)\n return num;\n\n var n = num.split(''); \n var str = '';\n var sk = 0;\n for (var i=0; i < x; i++) {\n if ((x-i)%3==2) { \n if (n[i] == '1') {\n str += tn[Number(n[i+1])] + ' ';\n i++;\n sk=1;\n } else if (n[i]!=0) {\n str += tw[num[i]-2] + ' ';\n sk=1;\n }\n } else if (n[i]!=0) { // 0235\n str += dg[n[i]] +' ';\n if ((x-i)%3==0) str += 'hundred ';\n sk=1;\n }\n if ((x-i)%3==1) {\n if (sk)\n str += th[(x-i-1)/3] + ' ';\n sk=0;\n }\n }\n\n if (x != num.length) {\n var y = num.length;\n str += 'point ';\n for (var i=x+1; i 0) {\n value = value.replace(/^0+/, '')\n }\n\n return value;\n}\n\nfunction fixTimeCitationData(value){\n if (value.length > 0) {\n let dataArray = value.split('/');\n\n switch (dataArray.length) {\n case 2:\n if (dataArray[1].length == 1) {\n dataArray[1] = '0' + dataArray[1]\n }\n break;\n \n case 3:\n if (dataArray[1].length == 1) {\n dataArray[1] = '0' + dataArray[1]\n }\n\n if (dataArray[2].length == 1) {\n dataArray[2] = '0' + dataArray[2]\n }\n break;\n }\n\n value = dataArray.join('/');\n\n value = removingLeadingZeros(value);\n\n if (value.startsWith('/0')) {\n value = value.substring(2, value.length);\n }\n\n if (value.startsWith('/')) {\n value = value.substring(1, value.length);\n }\n\n //twice for //\n if (value.startsWith('/')) {\n value = value.substring(1, value.length);\n }\n\n //last check is if this data is seconds only, append a 0 back to the begining so it ends up as 0:45 instead of 45\n if (!value.includes('/') && !value.includes(':')) {\n value = '0/' + value;\n }\n }\n\n return value;\n}\n\nfunction formatRetrievalDate(date){\n let formattedDate = '';\n\n try {\n if (date.includes(\"/\")) {\n\n date = date.replace('//', '/');\n\n var array = date.split(\"/\");\n\n switch (array.length) {\n case 3:\n if (date.endsWith(\"/\")) {\n formattedDate = dateHelper.format(date, 'mmmm d');\n }\n else{\n formattedDate = dateHelper.format(date, 'mmmm d, yyyy');\n }\n break;\n case 2:\n formattedDate = dateHelper.format(array[0] + '/1/' + array[1], 'mmmm, yyyy');\n break;\n case 1:\n formattedDate = dateHelper.format('1/1/' + array[0], 'yyyy');\n break;\n }\n }\n else{\n return date;\n }\n }\n catch(err) {\n console.log('Failed to convert retrieval date of ' + date);\n console.log(err);\n return date;\n }\n\n return formattedDate;\n}\n\nfunction getFullDate(date){\n\n if (date.length == 0) {\n date = 'n.d.';\n } else {\n if (date.includes(\"/\")) {\n var array = date.split(\"/\");\n\n let month = '';\n let day = '';\n let year = '';\n\n switch (array.length) {\n case 3:\n if (array[0].length > 0) {\n month = dateHelper.format(array[0] + '/1/2020', 'mmmm');\n }\n\n if (array[1].length > 0) {\n day = dateHelper.format('1/' + array[1] + '/2020', 'd');\n }\n\n if (array[2].length > 0) {\n year = dateHelper.format('1/1/' + array[2], 'yyyy');\n }\n\n break;\n case 2:\n\n //this is for the format of 2021/2022\n if (array[0].length == 4 && array[1].length == 4) {\n return date;\n }\n\n //for the format of May/June 2019\n if (array[1].includes(\" \")) {\n return date;\n } \n\n if (array[0].length > 0) {\n month = dateHelper.format(array[0] + '/1/2020', 'mmmm');\n }\n \n if (array[1].length > 0) {\n year = dateHelper.format('1/1/' + array[1], 'yyyy');\n }\n\n break;\n case 1: \n if (array[0].length > 0) {\n year = dateHelper.format('1/1/' + array[0], 'yyyy');\n }\n\n break;\n }\n\n if (year.length > 0) {\n date = year;\n }\n\n if (month.length > 0) {\n if (year.length > 0) {\n date = date + ', '\n }\n else{\n date = '';\n }\n\n date = date + month;\n }\n\n if (day.length > 0) {\n if (year.length > 0 && month.length == 0) {\n date = date + ', '\n } \n\n if (month.length > 0) {\n date = date + ' '\n } \n\n date = date + day;\n }\n \n } else {\n date = date;\n }\n }\n\n if (date == '//') {\n date = 'n.d.';\n }\n\n return date;\n}\n\nfunction getFullDateRange(startDate, endDate){\n\n //get the format for the start date, and we'll append the range to that\n let fullDate = getFullDate(startDate);\n\n let startYear = getYearFromDate(startDate);\n let startMonth = getMonthFromDate(startDate);\n let startDay = getDayFromDate(startDate);\n\n let endYear = getYearFromDate(endDate);\n let endMonth = getMonthFromDate(endDate);\n let endDay = getDayFromDate(endDate);\n\n //same year and month and day\n if (startYear == endYear && startMonth == endMonth && startDay == endDay) {\n return fullDate;\n }\n\n //same year and month\n if (startYear == endYear && startMonth == endMonth) {\n return fullDate + '–' + endDay;\n }\n\n //same year\n if (startYear == endYear) {\n return fullDate + '–' + endMonth + ' ' + endDay;\n }\n\n return fullDate + '–' + getFullDate(endDate);\n}\n\nfunction getYearFromDate(date){\n let year = '';\n var array = date.split(\"/\");\n\n switch (array.length) {\n case 3:\n if (array[2].length > 0) {\n year = dateHelper.format('1/1/' + array[2], 'yyyy');\n }\n break;\n case 2:\n if (array[1].length > 0) {\n year = dateHelper.format('1/1/' + array[1], 'yyyy');\n }\n break;\n case 1: \n if (array[0].length > 0) {\n year = dateHelper.format('1/1/' + array[0], 'yyyy');\n }\n break;\n }\n\n return year;\n}\n\nfunction getMonthFromDate(date){\n var array = date.split(\"/\");\n let month = '';\n\n switch (array.length) {\n case 3:\n if (array[0].length > 0) {\n month = dateHelper.format(array[0] + '/1/2020', 'mmmm');\n }\n\n break;\n case 2:\n if (array[0].length > 0) {\n month = dateHelper.format(array[0] + '/1/2020', 'mmmm');\n }\n\n break;\n }\n\n return month;\n}\n\nfunction getDayFromDate(date){\n var array = date.split(\"/\");\n let day = '';\n\n switch (array.length) {\n case 3:\n\n if (array[1].length > 0) {\n day = dateHelper.format('1/' + array[1] + '/2020', 'd');\n }\n break;\n }\n\n return day;\n}\n\nfunction getReverseFullDate(date){\n\n if (date.length == 0) {\n date = 'n.d.';\n } else {\n if (date.includes(\"/\")) {\n var array = date.split(\"/\");\n\n let month = '';\n let day = '';\n let year = '';\n\n switch (array.length) {\n case 3:\n if (array[0].length > 0) {\n month = dateHelper.format(array[0] + '/1/2020', 'mmmm');\n }\n\n if (array[1].length > 0) {\n day = dateHelper.format('1/' + array[1] + '/2020', 'd');\n }\n\n if (array[2].length > 0) {\n year = dateHelper.format('1/1/' + array[2], 'yyyy');\n }\n\n break;\n case 2:\n if (array[0].length > 0) {\n month = dateHelper.format(array[0] + '/1/2020', 'mmmm');\n }\n \n if (array[1].length > 0) {\n year = dateHelper.format('1/1/' + array[1], 'yyyy');\n }\n\n break;\n case 1: \n if (array[0].length > 0) {\n year = dateHelper.format('1/1/' + array[0], 'yyyy');\n }\n\n break;\n }\n\n date = '';\n\n if (month.length > 0) {\n date = month;\n }\n\n if (day.length > 0) {\n if (month.length > 0) {\n date = date + ' ';\n }\n\n date = date + day;\n }\n\n if (year.length > 0) {\n if (day.length > 0) {\n date = date + ', ';\n }\n else{\n if (month.length > 0) {\n date = date + ' ';\n }\n }\n\n date = date + year;\n }\n \n } else {\n date = date;\n }\n }\n\n return date;\n}\n\nfunction getCitations(citationData, authorString, year, authorArray){\n\n let firstCitation = ''\n let subsequentCitation = '';\n let location = getCitationLocationString(citationData);\n\n //check to see if any data needs clearing out\n if (citationData.namePart == 'false') {\n authorString = '';\n }\n\n if (citationData.datePart == 'false') {\n year = '';\n }\n \n if (authorString.length > 0) {\n firstCitation = authorString;\n }\n\n if (year.length > 0) {\n if (firstCitation.length > 0 && !firstCitation.endsWith('\" ')) {\n firstCitation = firstCitation + ', ';\n }\n firstCitation = firstCitation + year;\n }\n\n if (location.length > 0) {\n\n if (firstCitation.length > 0 && (!firstCitation.endsWith('\" ') || firstCitation.endsWith(', '))) {\n firstCitation = firstCitation + ', ';\n }\n\n firstCitation = firstCitation + location;\n }\n\n //if there is a group author, and it's in the first two contributors....and that group auther has an abbreviation, we have a different subsequent\n var contributorCounter = 0;\n var hasSubsequent = false;\n\n authorArray.forEach(item => {\n if (item.type == 'groupAuthor') {\n if (contributorCounter < 2) {\n var abbreviation = getStringValue(item.abbreviation);\n\n if (abbreviation.length > 0) {\n hasSubsequent = true;\n }\n }\n }\n\n contributorCounter++;\n });\n\n if (hasSubsequent) {\n let subsequentAuthorString = getCitationAuthorString(authorArray, true);\n \n if (citationData.namePart == 'false') {\n subsequentCitation = '';\n }\n else{\n if (subsequentAuthorString.length > 0) {\n subsequentCitation = subsequentAuthorString;\n }\n }\n\n if (year.length > 0) {\n if (subsequentCitation.length > 0 && !subsequentCitation.endsWith('\" ')) {\n subsequentCitation = subsequentCitation + ', ';\n }\n subsequentCitation = subsequentCitation + year;\n }\n \n if (location.length > 0) {\n \n if (subsequentCitation.length > 0 && (!subsequentCitation.endsWith('\" ') || subsequentCitation.endsWith(', '))) {\n subsequentCitation = subsequentCitation + ', ';\n }\n \n subsequentCitation = subsequentCitation + location;\n }\n }\n\n //trim these back\n firstCitation = firstCitation.trim();\n\n //make sure neither citation ends with a , or ,\"\n if (firstCitation.endsWith(',')) {\n firstCitation = firstCitation.substr(0, firstCitation.length -1);\n }\n\n if (firstCitation.endsWith(',\"')) {\n firstCitation = firstCitation.substr(0, firstCitation.length -2) + '\"';\n }\n\n let citation = {\n first : firstCitation,\n subsequent : subsequentCitation\n }\n\n return citation;\n}\n\nfunction stripSubtitle(title){\n \n if (title.includes(':')) {\n var array = title.split(\":\");\n title = array[0];\n }\n\n return title;\n}\n\nfunction fixEditionString(edition){\n\n if (edition.length > 0) {\n\n //if this is an integer, make it ordinal\n if (isInteger(edition)) {\n edition = getOrdinalValue(edition);\n }\n\n //replace edition with ed.\n if (edition.includes('edition')) {\n edition = edition.replace('edition', 'ed.');\n } \n\n //replace edition with Ed.\n if (edition.includes('Edition')) {\n edition = edition.replace('Edition', 'ed.');\n } \n\n //add ed if needed\n if (!edition.includes('ed.')) {\n edition = edition + ' ed.'\n }\n \n //if the string includes ed., is not at the end, and does not follow with a comma, add it\n if (edition.includes('ed.') &&\n !edition.endsWith('ed.') &&\n !edition.includes('ed.,')) {\n edition = edition.replace('ed.', 'ed.,');\n }\n }\n \n return edition;\n}\n\nfunction fixTitlePartClosure(titlePart){\n \n if (titlePart.length > 0) {\n if (!titlePart.endsWith('.') && !titlePart.endsWith('?') && !titlePart.endsWith('!')\n && !titlePart.endsWith('.') && !titlePart.endsWith('?') && !titlePart.endsWith('!')) {\n titlePart = titlePart + \".\";\n } \n }\n\n return titlePart;\n}\n\nfunction isSpecialMiddleName(middleName){\n //APA 10.92 Example 1\n //all I know of now is van, but if others are considered special, we can handle then here\n\n let isSpecial = false;\n\n if (middleName.length > 0) {\n if (middleName.toUpperCase() == 'VAN') {\n isSpecial = true;\n }\n }\n\n return isSpecial;\n}\n\nfunction formatURL(url){\n let formatURL = '';\n\n if (url.length > 0) {\n formatURL = '' + url + '';\n }\n\n return formatURL;\n}\n\nfunction removeTags(str) {\n //tutorialspoint.com/how-to-remove-html-tags-from-a-string-in-javascript\n if ((str===null) || (str===''))\n return false;\n else\n str = str.toString();\n return str.replace( /(<([^>]+)>)/ig, '');\n}\n\nfunction limitWordsInString(value, wordCount){\n let limitedValue = '';\n\n if (value.length == 0) {\n return value;\n }\n\n let valueArray = value.split(' ');\n\n if(valueArray.length > 0){\n if (valueArray.length > wordCount) {\n let i = 0;\n\n while (i < wordCount) {\n if (limitedValue.length > 0) {\n limitedValue = limitedValue + ' ';\n }\n\n limitedValue = limitedValue + valueArray[i];\n i++;\n }\n }\n else{\n limitedValue = value;\n }\n }\n else{\n limitedValue = value;\n }\n\n\n return limitedValue;\n}\n\nfunction removeEmptyContributors(contributors){\n \n //remove any empty contributors from the array\n if (typeof contributors === 'undefined') {\n return [];\n }\n\n let cleanContributors = [];\n\n if (contributors.length > 0) {\n _forEach(contributors, (contributor) => {\n \n if (typeof contributor.type !== 'undefined') {\n\n switch (contributor.type) {\n case 'author':\n case 'chapterAuthor':\n case 'custom':\n case 'executiveProducer':\n case 'executiveDirector':\n case 'executiveDirectorProducer':\n case 'director':\n case 'writer':\n case 'writerDirector':\n case 'host':\n case 'interview':\n \n if(contributor.lastName.length > 0 ||\n contributor.firstName.length > 0 ||\n contributor.middleName.length > 0 ||\n contributor.suffix.length > 0){\n cleanContributors.push(contributor);\n }\n\n break;\n case 'editor':\n case 'chapterTranslator':\n case 'translator':\n case 'narrator':\n case 'illustrator':\n case 'originalEditor':\n case 'performer':\n case 'chair':\n case 'reviewAuthor':\n case 'reviewDirector':\n case 'reviewWriter':\n case 'reviewWriterDirector':\n case 'reviewArtist':\n case 'reviewComposer':\n case 'reviewEditor':\n case 'volumeEditor': \n\n if(contributor.lastName.length > 0 ||\n contributor.firstName.length > 0 ||\n contributor.middleName.length > 0 ||\n contributor.suffix.length > 0){\n cleanContributors.push(contributor);\n }\n \n break;\n case 'userName':\n \n if(contributor.lastName.length > 0 ||\n contributor.firstName.length > 0 ||\n contributor.middleName.length > 0 ||\n contributor.suffix.length > 0 ||\n contributor.name.length > 0){\n cleanContributors.push(contributor);\n }\n\n break;\n case 'groupPerformer':\n\n if (typeof contributor.groupName === 'undefined') {\n break;\n }\n\n if (typeof contributor.abbreviation === 'undefined') {\n break;\n }\n\n if(contributor.groupName.length > 0 ||\n contributor.abbreviation.length > 0){\n cleanContributors.push(contributor);\n }\n\n break;\n case 'groupAuthor':\n case 'reviewGroupArtist':\n\n if (typeof contributor.groupName === 'undefined') {\n break;\n }\n\n if(contributor.groupName.length > 0){\n cleanContributors.push(contributor);\n }\n\n break;\n case 'testimony':\n\n if(contributor.lastName.length > 0 ||\n contributor.firstName.length > 0){\n cleanContributors.push(contributor);\n }\n \n break;\n }\n }\n \n });\n }\n\n return cleanContributors;\n}\n\nfunction getCitationVolume(citationData) {\n let volume = getStringValue(citationData.volume);\n\n return volume;\n}\n\nfunction removeEmptyPublishers(publishers) {\n //remove any empty publishers from the array\n if (typeof publishers === 'undefined') {\n return [];\n }\n\n let cleanPublishers = [];\n\n if (publishers.length > 0) {\n\n _forEach(publishers, (publisher) => {\n let foundSomething = false;\n \n if (typeof publisher.type !== 'undefined') {\n if (publisher.type.length > 0) {\n foundSomething = true;\n }\n }\n\n if (typeof publisher.city !== 'undefined') {\n if (publisher.city.length > 0) {\n foundSomething = true;\n }\n }\n\n if (typeof publisher.name !== 'undefined') {\n if (publisher.name.length > 0) {\n foundSomething = true;\n }\n }\n\n if (typeof publisher.state !== 'undefined') {\n if (publisher.state.length > 0) {\n foundSomething = true;\n }\n }\n\n if (foundSomething) {\n cleanPublishers.push(publisher);\n }\n\n });\n\n }\n\n return cleanPublishers;\n}","/*\n*****SocialMedia*****\n \nFORM: https://docs.google.com/spreadsheets/d/1ONLiQXCgZTGA9WWCIVTYKKW-0UESPrHl0ls6G-beJT4/edit#gid=2071428744\nMOCKUP: https://magical-design-system.webflow.io/add-in/wizard/wizard-2-social-media\n\nTYPES:\n post\n - single posts to a platform (tweet, highlight, etc.)\n page\n - A page on a platform (profile, about, etc.)\n forum\n - Citing a post in an online forum\n\npost: [contributors]. ([publicationDate]). [content]. [[attachment]] [[format]]. [platform]. Retrieved [retrievalDate] from, [url]\npage: [contributors]. ([publicationDate]). [title] [[description]]. [platform]. Retrieved [retrievalDate] from, [url]\nforum: [contributors]. ([pubicationDate]). [content] [Online forum post]. [platform]. [url]\n\nAuthorPart\n contributors\n - username: Same as before\n - Group Author (with username): this is a new addition to Group Authors\n content or title\n - if there's no username or Group Authors, then the content or title goes at the beginning (this shouldn't happen in real life)\n\nDatePart\n publicationDate\n - This is month, date, and year but include whatever is available\n - put \"n.d.\" for no date\n\nTitlePart\n content\n - this is the first twenty words of the content that is being cited. Users are going to put this in themselves.\n attachment\n - optionally included to describe any attached audiovisual media with the post\n title\n - title of the page being referenced\n description\n - description of the kind of page being referenced\n format\n - name of the posts (tweet, highlight, etc.)\n platform\n - name of the social media platform\n\nSourcePart\n retrievalDate\n - optional\n url\n - A url\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let type = shared.getStringValue(refData.type);\n\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = \"\";\n\n switch (type) {\n case 'post':\n titlePart = getPostTitlePart(refData);\n break;\n case 'page':\n titlePart = getPageTitlePart(refData);\n break;\n case 'forum':\n titlePart = getForumTitlePart(refData);\n break;\n }\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.content);\n\n if (title.length > 0) {\n //trim this to the first five words\n let titleArray = title.split(' ');\n if(titleArray.length > 0){\n let i = 0;\n\n while (i < 5) {\n if (authorString.length > 0) {\n authorString = authorString + ' ';\n }\n\n authorString = authorString + titleArray[i];\n i++;\n }\n\n authorString = authorString.italicize();\n }\n else{\n authorString = title.italicize();\n } \n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n else{\n year = shared.fixPageDash(year);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getPostTitlePart(refData){\n let titlePart = '';\n //[content]. [[attachment]] [[format]]. [platform].\n let content = shared.getStringValue(refData.content);\n let attachment = shared.getStringValue(refData.attachment);\n let format = shared.getStringValue(refData.format);\n\n if (content.length > 0) {\n content = shared.limitWordsInString(content, 20);\n titlePart = content.italicize();\n }\n\n if (attachment.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[' + attachment + ']';\n }\n\n if (format.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[' + format + '].';\n }\n\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart);\n }\n\n return titlePart;\n}\n\nfunction getPageTitlePart(refData){\n let titlePart = '';\n //[title] [[description]]. [platform].\n let title = shared.getStringValue(refData.title);\n let description = shared.getStringValue(refData.description);\n\n if (title.length > 0) {\n titlePart = title.italicize();\n }\n\n if (description.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[' + description + '].';\n }\n\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart);\n }\n\n return titlePart;\n}\n\nfunction getForumTitlePart(refData){\n let titlePart = '';\n // [content] [Online forum post]. [platform].\n let content = shared.getStringValue(refData.content);\n let attachment = shared.getStringValue(refData.attachment);\n \n\n if (content.length > 0) {\n content = shared.limitWordsInString(content, 20);\n titlePart = content.italicize();\n }\n\n if (attachment.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '[' + attachment + '].';\n }\n\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart);\n }\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0) {\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n let sourcePart = '';\n let platform = shared.getStringValue(refData.platform);\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n let url = shared.getStringValue(refData.url);\n\n if (platform.length > 0) {\n sourcePart = platform + '.';\n }\n\n if (retrievalDate.length > 0) {\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + 'Retrieved';\n sourcePart = sourcePart + ' ' + shared.formatRetrievalDate(retrievalDate);\n sourcePart = sourcePart + ', from';\n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}","/*\n*****Software*****\n \nFORM: https://docs.google.com/spreadsheets/d/1ebv0eYdsP_tlOwzR1uvEkHZFyn2P_HAlsYWpiRB_l3I/edit#gid=2071428744\nMOCKUP: https://magical-design-system.webflow.io/add-in/wizard/wizard-2-software-mobile-apps\n\nTYPES\n computer: software run on a computer\n [contributors]. ([publicationDate]). [title] (Version [version]) [Computer software]. [publisher.reference]. [url]\n mobile: mobile app\n [contributors]. ([publicationDate]). [title] (Version [version]) [Mobile app]. [publisher.reference]. [url]\n reference: reference entry in a mobile app\n [contributors]. ([publicationDate]). [entry]. In [title] (Version [version]) [Mobile app]. [publisher.reference]. [url]\n\nAuthorPart\n contributors\n - Normal authors & group Authors\n title\n - for computer or mobile, if there isn't a contributor\n entry\n - for reference if there is no contributors\n\nDatePart\n publicationDate\n - YYYY\n\nTitlePart\n entry\n - not italicized\n title\n - italicized\n version\n - follows title\n - has static text of \"(Version \" & \")\"\n Static Text\n - each type ends the title part with \"[Comptuer software]\" or \"[Mobile app]\"\n - Don't include if [title] is a description\n\nSourcePart\n publisher.reference\n - normal\n url\n - normal\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let referenceValue = '';\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n //referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart;\n referenceValue = titlePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.title);\n let entry = shared.getStringValue(refData.entry);\n\n if (entry.length > 0) {\n if (entry.startsWith('[')) {\n authorString = entry;\n }\n else{\n authorString = '\"' + entry + '\"'; \n }\n }\n else{\n title = shared.stripSubtitle(title);\n\n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n authorString = title.toTitleCase().italicize(); \n }\n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n else{\n year = shared.fixPageDash(year);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0) {\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let type = shared.getStringValue(refData.type);\n let entry = shared.getStringValue(refData.entry);\n let title = shared.getStringValue(refData.title);\n let version = shared.getStringValue(refData.version);\n let label = '';\n let ignoreLabel = false;\n\n let authorPart = getAuthorPart(refData);\n\n if (entry.length > 0) {\n titlePart = entry;\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n }\n\n //if we don't have author, move date to title part\n if (authorPart.length == 0 && type == 'reference') {\n let datePart = getDatePart(refData);\n\n if (datePart.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + datePart;\n }\n }\n\n if (title.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' In ';\n }\n\n if (!title.startsWith('[')) {\n title = title.italicize();\n }\n else{\n ignoreLabel = true;\n }\n\n titlePart = titlePart + title;\n }\n\n //if we don't have author, move date to title part\n if (authorPart.length == 0 && type != 'reference') {\n let datePart = getDatePart(refData);\n\n if (datePart.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + '. ';\n }\n\n titlePart = titlePart + datePart;\n }\n }\n\n if (version.length > 0) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + '(Version ' + version + ')';\n }\n\n if (type == 'computer') {\n label = '[Computer software]';\n }\n\n if (type == 'mobile' || type == 'reference') {\n label = '[Mobile app]';\n }\n\n if (label.length > 0 && !ignoreLabel) {\n\n if (titlePart.length > 0) {\n titlePart = titlePart + ' ';\n }\n\n titlePart = titlePart + label;\n }\n\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart);\n }\n\n return titlePart;\n}\n\nfunction getSourcePart(refData){\n let sourcePart = '';\n\n let url = shared.getStringValue(refData.url);\n let publisherString = shared.getPublisherString(refData.publishers);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n sourcePart = publisherString; \n } \n }\n \n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}","const _cloneDeep = require('lodash/cloneDeep');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n specialRules\n};\n\nfunction specialRules(references){\n\tlet _references = [];\n\n //iterarate each reference to update it's value\n references.forEach((thisReference) => {\n\t\t// clone thisReference so i can manipulate it\n\t\tlet _thisReference = _cloneDeep(thisReference);\n\n\t\tlet typeName = getTypeShortName(_thisReference.referenceTypeID);\n \n let typeEngine = getTypeEngine(typeName);\n let engineRef;\n let refDataObject; \n \n if (typeof _thisReference.data === 'string') {\n refDataObject = JSON.parse((_thisReference.data));\n }\n else{\n refDataObject = _thisReference.data;\n }\n\n engineRef = typeEngine.getReference(refDataObject);\n \n _thisReference.authorPart = engineRef.authorPart;\n _thisReference.datePart = engineRef.datePart;\n _thisReference.sameAuthorDatePartID = 0;\n _thisReference.newDatePart = '';\n _thisReference.orderByValue = engineRef.orderByValue;\n _thisReference.displayValue = engineRef.value;\n _thisReference.citationEtAlOverwrite = '';\n\n let citationData = new Object;\n citationData.namePart = true;\n citationData.datePart = true;\n citationData.label = '';\n citationData.value = '';\n citationData.type = 'notdirect';\n \n _thisReference.indirectCitation = typeEngine.getCitation(refDataObject, citationData, references);\n\n //so group authors with Abbreviations do not cause an issue with this logic, replace any abbreviations in that citation\n //Group Author [GA], 2021, p.2\n let startBracket = _thisReference.indirectCitation.first.indexOf('[');\n let endBracket = _thisReference.indirectCitation.first.indexOf(']');\n \n if (startBracket != -1 && endBracket != -1) {\n _thisReference.indirectCitation.first = _thisReference.indirectCitation.first.substring(0, startBracket - 1) + _thisReference.indirectCitation.first.substring(endBracket + 1);\n }\n\n //update the citations for this reference\n if (_thisReference.citations != undefined) {\n\n //see if this is a simgle object, or an array\n if (Array.isArray(_thisReference.citations)) {\n\n let counter = 1;\n\n _thisReference.citations.forEach(thisCitation => {\n\n thisCitation.apa7 = typeEngine.getCitation(refDataObject, thisCitation.citationData, references);\n\n if (counter > 1 && thisCitation.apa7.subsequent != '') {\n thisCitation.displayValue = '(' + thisCitation.apa7.subsequent + ')';\n }\n else{\n thisCitation.displayValue = '(' + thisCitation.apa7.first + ')';\n }\n \n counter++;\n });\n }\n else{\n if (typeof _thisReference.citations === 'object' && _thisReference.citations !== null) {\n _thisReference.citations.apa7 = typeEngine.getCitation(refDataObject, _thisReference.citations.citationData, references);\n _thisReference.citations.displayValue = '(' + _thisReference.citations.apa7.first + ')'; \n }\n }\n }\n\t\t_references.push(_thisReference);\n\t\t\n });//e:forEach\n\n //initial sort\n orderRefs(_references);\n\n //Same author date parts\n sameAuthorDateParts(_references);\n \n //Grouped Citations\n groupedCitations(_references);\n\n return _references;\n}\n\nfunction getTypeShortName(id){\n //swap the ID to the short name from types.json\n var typeData = require('../types.json');\n let typeShortName = '';\n \n typeData.refTypes.forEach(thisType => {\n if (thisType.id == id) {\n typeShortName = thisType.shortname;\n }\n });\n \n return typeShortName;\n }\n\n function getTypeEngine(type){\n var typeEngine = null;\n \n typeEngine = require('./APA7-' + type +'.js');\n \n return typeEngine;\n }\n\n function groupedCitations(references){\n\n //iterate and see if we have any grouped citations in the paper\n let groupCitationIds = [];\n\n references.forEach(thisRef => {\n\n if (thisRef.citations != undefined) {\n\n if (Array.isArray(thisRef.citations)) {\n for (var i = 0; i < thisRef.citations.length; i++) {\n let thisCitation = thisRef.citations[i];\n \n if (thisCitation.groupUniqueID != undefined) {\n if (thisCitation.groupUniqueID.length > 0) {\n \n //make sure this group id is not already in the list\n let found = false;\n groupCitationIds.forEach(thisGroupCitationID => {\n if (thisGroupCitationID.toUpperCase() == thisCitation.groupUniqueID.toUpperCase()) {\n found = true;\n }\n });\n \n if (!found) {\n groupCitationIds.push(thisCitation.groupUniqueID.toUpperCase());\n }\n \n }\n }\n }//e:for:citations\n }\n else{\n if (thisRef.citations.groupUniqueID != undefined) {\n if (thisRef.citations.groupUniqueID.length > 0) {\n //make sure this group id is not already in the list\n let found = false;\n groupCitationIds.forEach(thisGroupCitationID => {\n if (thisGroupCitationID.toUpperCase() == thisRef.citations.groupUniqueID.toUpperCase()) {\n found = true;\n }\n });\n \n if (!found) {\n groupCitationIds.push(thisRef.citations.groupUniqueID.toUpperCase());\n }\n }\n }\n }\n }\n\n });//e:for:references\n\n //process each group ID now\n groupCitationIds.forEach(thisGroupID => {\n\n let groupCitations = [];\n\n references.forEach(thisRef => {\n if (thisRef.citations != undefined) {\n\n if (Array.isArray(thisRef.citations)) {\n thisRef.citations.forEach(thisCitation =>{\n\n if (thisCitation.groupUniqueID != undefined) {\n if (thisCitation.groupUniqueID.toUpperCase() == thisGroupID.toUpperCase()) {\n \n //append some ref data that we may need in the next step building the output\n thisCitation.refAuthorPart = thisRef.authorPart;\n \n groupCitations.push(thisCitation);\n }\n }\n \n });//e:for:citations\n }\n else{\n if (thisRef.citations.groupUniqueID != undefined) {\n if (thisRef.citations.groupUniqueID.toUpperCase() == thisGroupID.toUpperCase()) {\n \n //append some ref data that we may need in the next step building the output\n thisRef.citations.refAuthorPart = thisRef.authorPart;\n\n groupCitations.push(thisRef.citations);\n }\n }\n }\n }\n });//e:for:references\n\n //make a pass through now to get our new value\n let groupValue = '';\n let lastRefAuthorPart = '';\n let lastCitationUsed = ''\n\n groupCitations.forEach(thisCitation => {\n\n let thisDisplay = thisCitation.displayValue;\n\n if (thisDisplay.startsWith('(')) {\n thisDisplay = thisDisplay.substring(1, thisDisplay.length);\n }\n\n if (thisDisplay.endsWith(')')) {\n thisDisplay = thisDisplay.substring(0, thisDisplay.length -1);\n }\n\n let displayToUse = thisDisplay;\n\n if (lastRefAuthorPart.length > 0) {\n if (thisCitation.refAuthorPart == lastRefAuthorPart) {\n\n //if this citation has a subsequent (Abbreviation) then we are going to just trim out the non author part\n if (thisCitation.apa7.subsequent.length > 0) {\n //remove to the first comma\n let commaSplit = thisDisplay.split(',');\n\n displayToUse = thisDisplay.substring(commaSplit[0].length + 2);\n }\n else{\n //loop through until we find the part of this citation that start to differ from the last one we used\n let found = false;\n for (let i = 0; i < displayToUse.length; i++) {\n\n if (!found) {\n\n let thisChar = displayToUse.charAt(i);\n\n if (shared.isInteger(thisChar)) {\n displayToUse = displayToUse.substring(i, displayToUse.length);\n found = true;\n }\n else{\n if (displayToUse.charAt(i) != lastCitationUsed.charAt(i)) {\n displayToUse = displayToUse.substring(i, displayToUse.length);\n found = true;\n } \n } \n }\n }\n }\n } \n }\n\n lastCitationUsed = thisDisplay;\n lastRefAuthorPart = thisCitation.refAuthorPart; \n \n if (displayToUse.length > 0) {\n if (groupValue.length > 0) {\n groupValue = groupValue + '; ';\n }\n\n groupValue = groupValue + displayToUse;\n }\n\n });//e:for:group citations\n\n if (groupValue.length > 0) {\n groupValue = '(' + groupValue + ')';\n }\n\n //now go back and set the display value back\n groupCitations.forEach(thisCitation => {\n thisCitation.displayValue = groupValue;\n });//e:for:group citations\n\n });\n\n }\n\n function sameAuthorDateParts(references){\n //see which references have the same author date parts\n let sameAuthorDatePartID = 1; \n let sameAuthorDatePartIDs = [];\n\n references.forEach(thisReference => {\n\n if (thisReference.authorPart != '' && thisReference.datePart != '' && thisReference.sameAuthorDatePartID == 0) {\n \n //inner loop for this reference\n let foundMatches = false;\n references.forEach(innerReference => {\n if (innerReference.referenceUniqueID != thisReference.referenceUniqueID &&\n innerReference.indirectCitation.first == thisReference.indirectCitation.first\n ) \n {\n //we found a matching author and date part\n foundMatches = true;\n thisReference.sameAuthorDatePartID = sameAuthorDatePartID;\n innerReference.sameAuthorDatePartID = sameAuthorDatePartID;\n }\n });\n\n //if we found a match, increment our id\n if (foundMatches) {\n sameAuthorDatePartIDs.push(sameAuthorDatePartID);\n sameAuthorDatePartID++;\n }\n }\n \n });\n\n //now that we have our matches, go back and see if we have any that contain et al\n //if we do, they need to have their citation author part \"extended\" instead of appended\n sameAuthorDatePartIDs.forEach(thisSameID =>{\n \n let matchingRefs = [];\n\n references.forEach(thisReference => {\n if (thisReference.sameAuthorDatePartID == thisSameID) {\n matchingRefs.push(thisReference);\n }\n });\n\n let refsToOverwrite = [];\n\n matchingRefs.forEach(thisReference => {\n\n //Short circuit this for refs with the exact same Author Part as another ref\n // all we can do is append a date later on\n let hasAnExactMatch = false;\n references.forEach(innerReference => {\n if (thisReference.referenceUniqueID != innerReference.referenceUniqueID &&\n thisReference.authorPart == innerReference.authorPart) {\n hasAnExactMatch = true;\n }\n }); \n\n\n if (thisReference.indirectCitation.first.includes('et al')){\n\n let alreadyFound = false;\n //pull out the refs we can overwrite\n matchingRefs.forEach(innerReference => {\n if (thisReference.referenceUniqueID != innerReference.referenceUniqueID && !alreadyFound && !hasAnExactMatch) {\n if (innerReference.authorPart != thisReference.authorPart) {\n refsToOverwrite.push(thisReference);\n alreadyFound = true;\n }\n }\n });\n\n }\n });\n\n //if we get here and this only has one reference, all others had an exact match, that one is good\n if (refsToOverwrite.length == 1) {\n refsToOverwrite[0].sameAuthorDatePartID = 0;\n refsToOverwrite = [];\n }\n\n refsToOverwrite.forEach(thisReference => {\n matchingRefs.forEach(innerReference => {\n\n if (thisReference.referenceUniqueID != innerReference.referenceUniqueID) {\n\n let refDataObject; \n \n if (typeof thisReference.data === 'string') {\n refDataObject = JSON.parse((thisReference.data));\n }\n else{\n refDataObject = thisReference.data;\n }\n\n let smallContribCount = refDataObject.contributors.length;\n let totalContribCount = smallContribCount;\n let addEtAl = false;\n\n let innerRefDataObject; \n\n if (typeof innerReference.data === 'string') {\n innerRefDataObject = JSON.parse((innerReference.data));\n }\n else{\n innerRefDataObject = innerReference.data;\n }\n\n if (innerRefDataObject.contributors.length < smallContribCount) {\n smallContribCount = innerRefDataObject.contributors.length;\n addEtAl = true;\n }\n \n let contributors = [];\n //loop authors until we find the difference\n let endMatches = false;\n for (var i = 0; i < smallContribCount; i++) {\n\n let firstInitial = refDataObject.contributors[i].firstName.getInitial();\n let innerFirstInitial = refDataObject.contributors[i].firstName.getInitial();\n\n if (!endMatches) {\n if (refDataObject.contributors[i].lastName == innerRefDataObject.contributors[i].lastName\n && refDataObject.contributors[i].middleName == innerRefDataObject.contributors[i].middleName\n && firstInitial == innerFirstInitial ) {\n contributors.push(refDataObject.contributors[i]);\n }\n else{\n\n if (i < smallContribCount - 1) {\n addEtAl = true;\n }\n\n contributors.push(refDataObject.contributors[i]);\n endMatches = true;\n } \n }\n }//e:contributors\n\n //if this is only 3 and the first 2 don't match, add them all\n if (contributors.length == 2 && totalContribCount == 3) {\n contributors.push(refDataObject.contributors[2]); \n addEtAl = false;\n }\n\n //as an addtional check, if this built out all of the references, then all we need to do is the normal et al\n if ((contributors.length + 1) == refDataObject.contributors.length && addEtAl) {\n contributors = [];\n contributors.push(refDataObject.contributors[0]);\n }\n\n let includeAmpersand = false;\n\n if (contributors.length == refDataObject.contributors.length) {\n includeAmpersand = true;\n }\n \n let overwrite = getCitationEtAlOverwrite(contributors, addEtAl, includeAmpersand);\n \n thisReference.citationEtAlOverwrite = overwrite;\n thisReference.sameAuthorDatePartID = 0;\n\n //this code may need to be moved depending on how grouped citations come into play\n //iterate every citation in this reference, find the author part from the indirect, and replace that part with the overwrite\n if (thisReference.citations != undefined) {\n let splitArray = thisReference.indirectCitation.first.split(',');\n splitArray.pop();\n\n let existingAuthorPart = splitArray.join(',');\n\n //see if this is a simgle object, or an array\n if (Array.isArray(thisReference.citations)) {\n\n if (thisReference.citations.length > 0) {\n let counter = 1;\n \n thisReference.citations.forEach(thisCitation =>{\n thisCitation.apa7.first = thisCitation.apa7.first.replace(existingAuthorPart, overwrite);\n thisCitation.apa7.subsequent = thisCitation.apa7.subsequent.replace(existingAuthorPart, overwrite);\n \n if (counter > 1 && thisCitation.apa7.subsequent.length > 0) {\n thisCitation.displayValue = '(' + thisCitation.apa7.subsequent + ')';\n }\n else{\n thisCitation.displayValue = '(' + thisCitation.apa7.first + ')';\n }\n \n counter++;\n });\n }\n }\n else{\n if (typeof thisReference.citations === 'object' && thisReference.citations !== null) {\n thisReference.citations.apa7.first = thisReference.citations.apa7.first.replace(existingAuthorPart, overwrite);\n thisReference.citations.apa7.subsequent = thisReference.citations.apa7.subsequent.replace(existingAuthorPart, overwrite);\n thisReference.citations.displayValue = '(' + thisReference.citations.apa7.first + ')';\n }\n }\n } \n }\n });\n });\n\n });\n\n\n //loop back through each match found and update it's date\n sameAuthorDatePartIDs.forEach(thisSameID =>{\n\n let counter = 0;\n references.forEach(thisReference => {\n\n if (thisReference.sameAuthorDatePartID == thisSameID) {\n let suffixToAdd = String.fromCharCode(97 + counter); //https://stackoverflow.com/questions/3145030/convert-integer-into-its-character-equivalent-where-0-a-1-b-etc\n \n let refsDate = thisReference.datePart.replace('(', '');\n refsDate = refsDate.replace(').', '');\n\n let newDatePart;\n\n if (refsDate != 'n.d.' && refsDate != 'in press') {\n //we need to see if this date contains more than just the year\n if (refsDate.length > 4) {\n newDatePart = '(' + refsDate.substring(0, 4) + suffixToAdd + ',' + refsDate.substring(5, refsDate.length) + ').';\n }\n else{\n\n newDatePart = '(' + refsDate + suffixToAdd + ').';\n }\n\n thisReference.displayValue = thisReference.displayValue.replace(thisReference.datePart, newDatePart);\n thisReference.orderByValue = shared.getOrderByValue(thisReference.displayValue);\n\n if (thisReference.citations != undefined) {\n\n let citationDate = refsDate;\n\n //only grab the year, since that is what is in the citation\n if (citationDate.length > 0) {\n citationDate = refsDate.substring(0, 4);\n }\n\n //see if this is a simgle object, or an array\n if (Array.isArray(thisReference.citations)) {\n\n if (thisReference.citations.length > 0) {\n thisReference.citations.forEach(thisCitation =>{\n thisCitation.displayValue = thisCitation.displayValue.replace(citationDate, citationDate + suffixToAdd);\n });\n }\n }\n else{\n if (thisReference.citations.displayValue != undefined) {\n thisReference.citations.displayValue = thisReference.citations.displayValue.replace(citationDate, citationDate + suffixToAdd);\n }\n }\n }\n \n counter++; \n }\n else{\n\n newDatePart = '(' + refsDate + '-' + suffixToAdd + ').';\n\n thisReference.displayValue = thisReference.displayValue.replace('(' + refsDate + ').', newDatePart);\n thisReference.orderByValue = shared.getOrderByValue(thisReference.displayValue);\n\n if (thisReference.citations != undefined) {\n\n //see if this is a simgle object, or an array\n if (Array.isArray(thisReference.citations)) {\n if (thisReference.citations.length > 0) {\n thisReference.citations.forEach(thisCitation =>{\n thisCitation.displayValue = thisCitation.displayValue.replace(refsDate, refsDate + '-' + suffixToAdd);\n });\n }\n }\n else{\n if (thisReference.citations.displayValue != undefined) {\n thisReference.citations.displayValue = thisReference.citations.displayValue.replace(refsDate, refsDate + '-' + suffixToAdd);\n }\n }\n }\n\n counter++;\n }\n }\n });\n\n });\n\n }\n\n function getCitationEtAlOverwrite(authors, addEtAl, includeAmpersand){\n var authorString = '';\n var counter = 0;\n\n authors.forEach(item => {\n if (counter > 0) {\n\n authorString = authorString + ', '\n\n if (includeAmpersand && counter == authors.length - 1) {\n authorString = authorString + '& '\n }\n\n // if (counter == authors.length - 1) {\n \n // if (!addEtAl) {\n // authorString = authorString + ','; \n // }\n\n // //authorString = authorString + ' & '\n // }\n // else{\n // authorString = authorString + ', '\n // }\n }\n\n authorString = authorString + shared.getCitationName(item, false);\n\n counter++;\n });\n\n if (addEtAl) {\n\n if (authors.length > 1) {\n authorString = authorString + ',';\n }\n\n authorString = authorString + ' et al.';\n }\n \n return authorString;\n}\n\n function orderRefs(references){\n //order the results\n references.sort((a, b) => {\n let textA = '';\n let textB = '';\n\n if (a.orderByValue !== null) {\n textA = a.orderByValue;\n }\n\n if (b.orderByValue !== null) {\n textB = b.orderByValue;\n }\n\n if (textA.length > 0) {\n textA = textA.toUpperCase();\n }\n\n if (textB.length > 0) {\n textB = textB.toUpperCase();\n }\n\n return textA < textB ? -1 : textA > textB ? 1 : 0;\n });//e:sort\n }","/*\n*****Speech*****\n \nMOCKUP: https://magical-design-system.webflow.io/add-in/wizard/wizard-2-speech-recorded-audio\nFORM: https://docs.google.com/spreadsheets/d/1FfXVmRtXa2XIeZX5RJAvDVhil7_Pgr-rJgHSiMNsH9w/edit#gid=2071428744\n\nTYPE & KIND\n - There are no types/kinds.\n\nBREAKDOWN\n [contributors]. ([publicationDate]). [title] [Speech audio recording]. [publisher]. [url]\n\nAuthorPart\n contributor\n - Acts normally\n\nDatePart\n publicationDate\n - Acts normally as YYYY, MM DD\n\nTitlePart\n title\n - Normal title in sentence case\n \"[Speech audio recording].\"\n - this is added text to every reference after the title\n\nSourcePart\n publisher\n - Normal publisher\n url\n - Normal url\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let authorPart = getAuthorPart(refData);\n let datePart = getDatePart(refData);\n let title = shared.getStringValue(refData.title);\n let publisherString = shared.getPublisherString(refData.publishers);\n let url = shared.getStringValue(refData.url);\n\n if (authorPart.length > 0) {\n referenceValue = authorPart;\n\n referenceValue = referenceValue + ' ' + datePart;\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n referenceValue = referenceValue + ' ' + title + '.'; \n }\n else{\n referenceValue = referenceValue + ' ' + title.italicize() + ' [Speech audio recording].'; \n }\n } \n }\n else{\n if (title.length > 0) {\n if (title.startsWith('[')) {\n referenceValue = title + '.'; \n }\n else{\n referenceValue = title.italicize() + ' [Speech audio recording].'; \n }\n } \n\n referenceValue = referenceValue + ' ' + datePart;\n }\n\n if (publisherString.length > 0) {\n referenceValue = referenceValue + ' ' + publisherString;\n\n if (!referenceValue.endsWith('.')) {\n referenceValue = referenceValue + '.';\n }\n }\n \n if (url.length > 0) {\n url = shared.formatURL(url);\n referenceValue = referenceValue + ' ' + url;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.title);\n title = shared.stripSubtitle(title);\n\n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n authorString = title.toTitleCase().italicize(); \n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n else{\n year = shared.fixPageDash(year);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0) {\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n }\n \n return authorPart;\n}\n\nfunction getDatePart(refData){\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}","/*\n*****Statutes*****\n \nFORM: https://docs.google.com/spreadsheets/d/1UNwDJj93PUey3aT7efImjaEZhTddn4KkatKLSyIocrY/edit#gid=2071428744\nMOCKUP: Mockup\n\nTYPES & KINDS\n - federal: Federal statutes\n - usc: Statutes found in the United States Code\n - pl: Statutes found by Public Law Number\n - state: State statutes\n\nFEDERAL USC\n - [title], [volume] U.S.C. § [section] ([publicationDate]). [url]\n *** publicationDate may include more than just YYYY (\"2018 & rev. 2019\").\n *** section is a bit of a booger. If [section] includes a dash, hyphen, en dash, or em dash, break at it. Only show the first part. Replace the rest with \"et seq.\" as seen in the tests. If there aren't any dashes, then just enter whatever they put.\n *** Citations use [shortTitle]\n\nFEDERAL PL\n - [title], Pub. L. No. [number], [volume] Stat. [pageNumber] ([publicationDate]). [url]\n *** same rules for publicationDate \n *** Citations use [shortTitle]\n\nSTATE\n - [title], [sourceTitle] [sourceLocation] ([publicationDate]). [url]\n *** same rules for publicationDate\n *** Citations use [shortTitle]\n\n*/\n\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0) {\n return 'Type and Kind required.';\n }\n\n switch (type) {\n case 'federal':\n\n if (kind == 'usc') {\n referenceValue = getFederalUSCReference(refData);\n }\n\n if (kind == 'pl') {\n referenceValue = getFederalPLReference(refData);\n }\n\n break;\n case 'state':\n referenceValue = getStateReference(refData);\n break;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: '',\n datePart: ''\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData) {\n let title = shared.getStringValue(refData.title);\n let shortTitle = shared.getStringValue(refData.shortTitle);\n let year = shared.getYear(refData.publicationDate);\n let revisedDate = shared.getStringValue(refData.revisedDate);\n\n if (shortTitle.length > 0) {\n title = shortTitle;\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n if (revisedDate.length > 0) {\n year = year + '/' + revisedDate;\n }\n\n let citation = shared.getCitations(citationData, title, year, []);\n\n return citation;\n}\n\nfunction getFederalUSCReference(refData){\n //- [title], [volume] U.S.C. § [section] ([publicationDate]). [url]\n let referenceValue = '';\n\n let title = shared.getStringValue(refData.title);\n let volume = shared.getStringValue(refData.volume);\n let section = shared.getStringValue(refData.section);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let revisedDate = shared.getStringValue(refData.revisedDate);\n let url = shared.getStringValue(refData.url);\n\n if (title.length > 0) {\n referenceValue = title;\n }\n\n if (volume.length > 0) {\n if (title.length > 0) {\n referenceValue = referenceValue + ', ';\n }\n\n referenceValue = referenceValue + volume;\n }\n\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' ';\n }\n\n referenceValue = referenceValue + 'U.S.C.';\n\n if (section.length > 0) {\n section = formatSectionString(section);\n referenceValue = referenceValue + ' § ' + section;\n }\n\n if (publicationDate.length > 0 || revisedDate.length > 0) {\n referenceValue = referenceValue + ' (';\n\n if (publicationDate.length > 0) {\n referenceValue = referenceValue + publicationDate;\n }\n\n if (revisedDate.length > 0) {\n referenceValue = referenceValue + ' & rev. ' + revisedDate;\n }\n\n referenceValue = referenceValue + ')';\n }\n\n if (!referenceValue.endsWith('.')) {\n referenceValue = referenceValue + '.';\n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n referenceValue = referenceValue + ' ' + url;\n }\n\n return referenceValue;\n}\n\nfunction getFederalPLReference(refData){\n //- [title], Pub. L. No. [number], [volume] Stat. [pageNumber] ([publicationDate]). [url]\n let referenceValue = '';\n\n let title = shared.getStringValue(refData.title);\n let number = shared.getStringValue(refData.number);\n let volume = shared.getStringValue(refData.volume);\n let pageNumber = shared.getStringValue(refData.pageNumber);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let revisedDate = shared.getStringValue(refData.revisedDate);\n let url = shared.getStringValue(refData.url);\n\n if (title.length > 0) {\n referenceValue = title;\n }\n\n if (number.length > 0) {\n if (title.length > 0) {\n referenceValue = referenceValue + ', ';\n }\n\n referenceValue = referenceValue + 'Pub. L. No. ' + number;\n }\n\n if (volume.length > 0) {\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ', ';\n }\n\n referenceValue = referenceValue + volume;\n }\n\n if (pageNumber.length > 0) {\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' ';\n }\n\n referenceValue = referenceValue + 'Stat. ' + pageNumber;\n }\n\n if (publicationDate.length > 0 || revisedDate.length > 0) {\n referenceValue = referenceValue + ' (';\n\n if (publicationDate.length > 0) {\n referenceValue = referenceValue + publicationDate;\n }\n\n if (revisedDate.length > 0) {\n referenceValue = referenceValue + ' & rev. ' + revisedDate;\n }\n\n referenceValue = referenceValue + ')';\n }\n\n if (!referenceValue.endsWith('.')) {\n referenceValue = referenceValue + '.';\n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n referenceValue = referenceValue + ' ' + url;\n }\n\n return referenceValue;\n}\n\nfunction getStateReference(refData){\n // - [title], [sourceTitle] [sourceLocation] ([publicationDate]). [url]\n let referenceValue = '';\n\n let title = shared.getStringValue(refData.title);\n let sourceTitle = shared.getStringValue(refData.sourceTitle);\n let sourceLocation = shared.getStringValue(refData.sourceLocation);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let revisedDate = shared.getStringValue(refData.revisedDate);\n let url = shared.getStringValue(refData.url);\n\n if (title.length > 0) {\n referenceValue = title;\n }\n\n if (sourceTitle.length > 0) {\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ', ';\n }\n\n referenceValue = referenceValue + sourceTitle;\n }\n\n if (sourceLocation.length > 0) {\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' ';\n }\n\n referenceValue = referenceValue + sourceLocation;\n }\n\n if (publicationDate.length > 0 || revisedDate.length > 0) {\n referenceValue = referenceValue + ' (';\n\n if (publicationDate.length > 0) {\n referenceValue = referenceValue + publicationDate;\n }\n\n if (revisedDate.length > 0) {\n referenceValue = referenceValue + ' & rev. ' + revisedDate;\n }\n\n referenceValue = referenceValue + ')';\n }\n\n if (!referenceValue.endsWith('.')) {\n referenceValue = referenceValue + '.';\n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n referenceValue = referenceValue + ' ' + url;\n }\n\n return referenceValue;\n}\n\nfunction formatSectionString(section){\n let suffix = ' et seq.';\n let array = [];\n\n if (section.includes('-')) {\n array = section.split(\"-\");\n\n return array[0] + suffix;\n }\n\n if (section.includes('–')) {\n array = section.split(\"–\");\n\n return array[0] + suffix;\n }\n\n if (section.includes('—')) {\n array = section.split(\"—\");\n\n return array[0] + suffix;\n }\n \n return section;\n}","/*\n*****Television*****\n \nDocumentation: https://docs.google.com/spreadsheets/d/1BHPmBwwZNGbyJhpkeCR_6haUPWLYsnSy7jOOYoQ1GZk/edit#gid=2071428744\n\nType & Kind Questions\n- series: An entire television series\n- episode: A single episode or webisode from a television series\n\n**SERIES PARTS**\nAuthorPart\n - Contributors\n - Executive Directors (Authora, A. A. (Executive Director)) [contributor.executiveDirector]\n - Executive Producers (Authora, A. A. (Executive Producer)) [contributor.executiveProducer]\n - Executive Director & Producer (Authora, A. A. (Executive Director & Executive Producer)) [contributor.executiveDirectorProducer]\n - If there is only one kind of contributor with multiple people, list them togehter (Authora, A. A., & Authorb, B. B. (Executive Producers)). We can't combine all roles into one if there are multiple contributor types.\n - Role possibilites:\n - Executive Director\n - Executive Directors (multiple Ex. Director contributors only)\n - Executive Producer\n - Executive Producers (multiple Ex. Producer contributors only)\n - Executive Director & Executive Producer\n - Executive Directors & Executive Producers (multiple Ex. Director/Ex. Producer contributors only)\n - Order of Contributor Roles\n - Executive Directors\n - Executive Producer\n - Executive Director & Producer\n - Custom\n\nDatePart\n - Years the series aired\n - Uses an en dash (\"–\")\n - Can include text (e.g., 2015–present)\n - (2015–present)\n - Ends with a period\n\nTitlePart\n - Title of the series in italics ()The wire), followed by a period\n - followed by \"[TV series]\"\n\nSourcePart\n - Production Company Names, separated by semi-colons if multiple (publishers)\n - End with a period\n\n\n**EPISODE PARTS**\nAuthorPart\n - Contributors\n - Writer (Authora, A. A. (Writer)) [contributor.writer]\n - Director (Authora, A. A. (Director)) [contributor.director]\n - Writer & Director (Authora, A. A. (Writer & Director)) [contributor.writerDirector]\n - Role possibilites:\n - Writer\n - Writers (multiple Writer contributors only)\n - Director\n - Directors (multiple Director contributors only)\n - Writer & Director\n - Writers & Directors (multiple Writer/Director contributors only)\n - Order of Contributor Roles\n - Writers\n - Directors\n - Writers & Directors\n - Custom\n\nDatePart\n - Date the episode first aired\n - Year, Month Date\n - (2015, April 1)\n - Ends with period\n\nTitlePart\n - Title of the episode, not italicized (e.g., Who shot Mr. Burns? (Part one))\n - Season & episode number in parentheses (Season 4, Episode 12)\n - followed by \"[TV series episode]\"\n\nSourcePart\n - Starts with \"In \"\n - Then list secondary contributors\n - Executive Directors (A. A. Authora, (Executive Director))\n - Executive Producers (A. A. Authora, (Executive Producer))\n - If there is only one kind of contributor with multiple people, list them togehter (A. A. Authora, & B. B. Authorb (Executive Producers)). We can't combine all roles into one if there are multiple contributor types.\n - Role possibilites:\n - Executive Director\n - Executive Directors (multiple Ex. Director contributors only)\n - Executive Producer\n - Executive Producers (multiple Ex. Producer contributors only)\n - Executive Director & Executive Producer\n - Executive Directors & Executive Producers (multiple Ex. Director/Ex. Producer contributors only)\n - Order of Contributor Roles\n - Executive Directors\n - Executive Producer\n - Executive Director & Producer\n - Custom\n - Follow with a comma\n - Title of the series in italics ()The wire), followed by a period\n - Production Company Names, separated by semi-colons if multiple (publishers)\n - End with a period\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let refAuthorPart = '';\n let refDatePart = '';\n\n //this type breaks out differently based off series or episode\n switch (refData.type) {\n case 'series':\n \n let seriesDatePart = getSeriesDatePart(refData);\n let seriesSourcePart = getSeriesSourcePart(refData);\n let seriesAuthorPart = getSeriesAuthorPart(refData, false);\n let seriesTitlePart = getSeriesTitlePart(refData);\n\n refAuthorPart = seriesAuthorPart;\n refDatePart = seriesDatePart;\n \n if (seriesAuthorPart.length == 0) {\n //no contributors\n referenceValue = seriesTitlePart + ' ' + seriesDatePart + ' ' + seriesSourcePart; \n }\n else{\n referenceValue = seriesAuthorPart + ' ' + seriesDatePart + ' ' + seriesTitlePart + ' ' + seriesSourcePart;\n }\n\n break;\n case 'episode':\n \n let episodeDatePart = getEpisodeDatePart(refData);\n let episodeSourcePart = getEpisodeSourcePart(refData);\n let episodeAuthorPart = getEpisodeAuthorPart(refData);\n let episodeTitlePart = getEpisodeTitlePart(refData);\n\n refAuthorPart = episodeAuthorPart;\n refDatePart = episodeDatePart;\n \n if (episodeAuthorPart.length == 0) {\n //no contributors\n referenceValue = episodeTitlePart + ' ' + episodeDatePart + ' ' + episodeSourcePart; \n }\n else{\n referenceValue = episodeAuthorPart + ' ' + episodeDatePart + ' ' + episodeTitlePart + ' ' + episodeSourcePart;\n }\n\n break;\n }\n \n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: refAuthorPart,\n datePart: refDatePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n if (refData.type == 'episode') {\n //writers\n _forEach(refData.contributors, (item) => {\n if (item.type == 'writer'){\n authorArray.push(item);\n }\n });\n\n //directors\n _forEach(refData.contributors, (item) => {\n if (item.type == 'director'){\n authorArray.push(item);\n }\n });\n\n //writers and directors\n _forEach(refData.contributors, (item) => {\n if (item.type == 'writerDirector'){\n authorArray.push(item);\n }\n });\n\n //custom\n _forEach(refData.contributors, (item) => {\n if (item.type == 'custom'){\n authorArray.push(item);\n }\n });\n }\n\n if (refData.type == 'series') {\n //executiveDirector\n _forEach(refData.contributors, (item) => {\n if (item.type == 'executiveDirector'){\n authorArray.push(item);\n }\n });\n\n //executiveProducer\n _forEach(refData.contributors, (item) => {\n if (item.type == 'executiveProducer'){\n authorArray.push(item);\n }\n });\n\n //executiveDirectorProducer\n _forEach(refData.contributors, (item) => {\n if (item.type == 'executiveDirectorProducer'){\n authorArray.push(item);\n }\n });\n\n //custom\n _forEach(refData.contributors, (item) => {\n if (item.type == 'custom'){\n authorArray.push(item);\n }\n });\n }\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n year = shared.fixPageDash(year);\n\n if (year.length > 0) {\n year = year.split(' ').join('');\n }\n\n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n let title = shared.getStringValue(refData.title);\n let episodeTitle = shared.getStringValue(refData.episodeTitle);\n\n //if we have an episode title, use it instead\n if (episodeTitle.length > 0) {\n title = episodeTitle;\n }\n \n title = shared.stripSubtitle(title);\n\n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n if (episodeTitle.length > 0) {\n authorString = '\"' + title.toTitleCase() + ',\" '\n }\n else{\n authorString = title.toTitleCase().italicize();\n } \n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n if (citationData.type == 'time') {\n citationData.value = shared.fixTimeCitationData(citationData.value);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n //since time is treated differently here than from other places, replace / with :\n if (citationData.type == 'time') {\n citation.first = citation.first.split(\"/\").join(\":\");\n citation.subsequent = citation.subsequent.split(\"/\").join(\":\");\n }\n\n return citation;\n}\n\nfunction getSeriesTitlePart(refData){\n //Series title [TV series].\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n\n if (title.startsWith('[')) {\n titlePart = title + ' [TV series].'\n }\n else{\n titlePart = title.italicize() + ' [TV series].'\n }\n }\n\n return titlePart;\n}\n\nfunction getSeriesAuthorPart(refData, isSecondary){\n //Authora, A. A., Authorb, B. B., Authorc, C. C., & Authord, D. D. (Executive Producers).\n //Authora, A. A. (Executive Director), Authorb, B. B. (Executive Producer), Authorc, C. C. (Executive Producer), & Authord, D. D. (Executive Producer).\n let authorPart = '';\n\n //order by: executive director, executive producer, exec dir + exec prod\n //then order within how listed\n //custom at the end\n\n if (typeof refData.contributors === 'undefined') {\n return '';\n }\n\n if (refData.contributors.length == 0) {\n return '';\n }\n\n let executiveProducerArray = [];\n let executiveDirectorArray = [];\n let executiveDirectorProducerArray = [];\n let customArray = [];\n let authorCount = 0;\n let typeCount = 0;\n\n let typeAdded = false;\n _forEach(refData.contributors, (item) => {\n if (item.type == 'executiveProducer') {\n executiveProducerArray.push(item);\n authorCount++;\n\n if (!typeAdded) {\n typeCount++;\n typeAdded = true;\n }\n }\n });\n\n typeAdded = false;\n _forEach(refData.contributors, (item) => {\n if (item.type == 'executiveDirector') {\n executiveDirectorArray.push(item);\n authorCount++;\n\n if (!typeAdded) {\n typeCount++;\n typeAdded = true;\n }\n }\n });\n\n typeAdded = false;\n _forEach(refData.contributors, (item) => {\n if (item.type == 'executiveDirectorProducer') {\n executiveDirectorProducerArray.push(item);\n authorCount++;\n\n if (!typeAdded) {\n typeCount++;\n typeAdded = true;\n }\n }\n });\n\n if (!isSecondary) {\n typeAdded = false;\n _forEach(refData.contributors, (item) => {\n if (item.type == 'custom') {\n customArray.push(item);\n authorCount++;\n\n if (!typeAdded) {\n typeCount++;\n typeAdded = true;\n }\n }\n }); \n }\n \n //not sure how this would be possible to have contribs not in this list, but whatever\n if (authorCount == 0) {\n return '';\n }\n\n //now based off the total number we have to process, loop through all arrays at once and build the strings\n if (authorCount == 1) {\n //only one in one of these arrays\n if (executiveProducerArray.length == 1) {\n let thisName;\n\n if (isSecondary) {\n thisName = shared.getReverseCitationName(executiveProducerArray[0]);\n }\n else{\n thisName = shared.getReferenceName(executiveProducerArray[0]);\n }\n\n let thisLabel = getLabelForContributorType(executiveProducerArray[0], false);\n let thisFullName = thisName + ' (' + thisLabel + ')';\n\n authorPart = thisFullName;\n }\n\n if (executiveDirectorArray.length == 1) {\n let thisName;\n\n if (isSecondary) {\n thisName = shared.getReverseCitationName(executiveDirectorArray[0]);\n }\n else{\n thisName = shared.getReferenceName(executiveDirectorArray[0]);\n }\n \n let thisLabel = getLabelForContributorType(executiveDirectorArray[0], false);\n let thisFullName = thisName + ' (' + thisLabel + ')';\n\n authorPart = thisFullName;\n }\n\n if (executiveDirectorProducerArray.length == 1) {\n let thisName;\n\n if (isSecondary) {\n thisName = shared.getReverseCitationName(executiveDirectorProducerArray[0]);\n }\n else{\n thisName = shared.getReferenceName(executiveDirectorProducerArray[0]);\n }\n \n let thisLabel = getLabelForContributorType(executiveDirectorProducerArray[0], false);\n let thisFullName = thisName + ' (' + thisLabel + ')';\n\n authorPart = thisFullName;\n }\n\n if (customArray.length == 1) {\n let thisName = shared.getReferenceName(customArray[0]);\n let thisLabel = getLabelForContributorType(customArray[0], false);\n let thisFullName = thisName + ' (' + thisLabel + ')';\n\n authorPart = thisFullName;\n }\n }\n\n //2-20\n if (authorCount > 1 && authorCount < 21) {\n let namesUsed = 0;\n \n //Executive Directors\n executiveDirectorArray.forEach(item => {\n let thisName;\n\n if (isSecondary) {\n thisName = shared.getReverseCitationName(item);\n }\n else{\n thisName = shared.getReferenceName(item);\n }\n\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount, isSecondary) + thisName;\n }\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n\n namesUsed++;\n });\n\n if (executiveDirectorArray.length > 0 && typeCount == 1) {\n let thisLabel = getLabelForContributorType(executiveDirectorArray[0], true);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n\n //Executive Producers\n executiveProducerArray.forEach(item => {\n let thisName;\n\n if (isSecondary) {\n let x = shared.getReverseCitationName(item) ;\n thisName = shared.getReverseCitationName(item);\n }\n else{\n thisName = shared.getReferenceName(item);\n }\n\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount, isSecondary) + thisName;\n }\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n\n namesUsed++;\n });\n\n if (executiveProducerArray.length > 0 && typeCount == 1) {\n let thisLabel = getLabelForContributorType(executiveProducerArray[0], true);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n\n //Executive Directors and Producers\n executiveDirectorProducerArray.forEach(item => {\n let thisName;\n\n if (isSecondary) {\n thisName = shared.getReverseCitationName(item);\n }\n else{\n thisName = shared.getReferenceName(item);\n }\n\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount, isSecondary) + thisName;\n }\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n\n namesUsed++;\n });\n\n if (executiveDirectorProducerArray.length > 0 && typeCount == 1) {\n let thisLabel = getLabelForContributorType(executiveDirectorProducerArray[0], true);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n\n //Customs\n customArray.forEach(item => {\n let thisName;\n\n if (isSecondary) {\n thisName = shared.getReverseCitationName(item);\n }\n else{\n thisName = shared.getReferenceName(item);\n }\n\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount, isSecondary) + thisName;\n }\n\n let thisLabel = getLabelForContributorType(item, false);\n\n authorPart = authorPart + ' (' + thisLabel + ')';\n\n namesUsed++;\n });\n }\n\n //More Than Twenty\n if (authorCount > 20) {\n let namesUsed = 0;\n\n //Executive Directors\n executiveDirectorArray.forEach(item => {\n let thisName;\n\n if (isSecondary) {\n thisName = shared.getReverseCitationName(item);\n }\n else{\n thisName = shared.getReferenceName(item);\n }\n\n if (namesUsed < 19) {\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount, isSecondary) + thisName;\n }\n \n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n if(isSecondary){\n authorPart = authorPart + ',';\n }\n\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n \n namesUsed++;\n }\n else{\n if (namesUsed == authorCount - 1) {\n authorPart = authorPart + ',...'\n authorPart = authorPart + thisName;\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n }\n }\n });\n \n if (executiveDirectorArray.length > 0 && typeCount == 1 && (namesUsed < 19 || namesUsed == authorCount)) {\n let thisLabel = getLabelForContributorType(executiveDirectorArray[0],true);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n \n //Executive Producers\n executiveProducerArray.forEach(item => {\n let thisName;\n\n if (isSecondary) {\n thisName = shared.getReverseCitationName(item);\n }\n else{\n thisName = shared.getReferenceName(item);\n }\n\n if (namesUsed < 19) {\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount, isSecondary) + thisName;\n }\n \n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n\n if(isSecondary){\n authorPart = authorPart + ',';\n }\n\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n \n namesUsed++;\n }\n else{\n if (namesUsed == authorCount - 1) {\n authorPart = authorPart + ',...'\n authorPart = authorPart + thisName;\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n }\n }\n });\n \n if (executiveProducerArray.length > 0 && typeCount == 1 && (namesUsed < 19 || namesUsed == authorCount)) {\n let thisLabel = getLabelForContributorType(executiveProducerArray[0], true);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n \n //Executive Directors and Producers\n executiveDirectorProducerArray.forEach(item => {\n let thisName;\n\n if (isSecondary) {\n thisName = shared.getReverseCitationName(item);\n }\n else{\n thisName = shared.getReferenceName(item);\n }\n\n if (namesUsed < 19) {\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount, isSecondary) + thisName;\n }\n \n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n \n if(isSecondary){\n authorPart = authorPart + ',';\n }\n\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n \n namesUsed++;\n }\n else{\n if (namesUsed == authorCount - 1) {\n authorPart = authorPart + ',...'\n authorPart = authorPart + thisName;\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n }\n }\n });\n \n if (executiveDirectorProducerArray.length > 0 && typeCount == 1 && (namesUsed < 19 || namesUsed == authorCount)) {\n let thisLabel = getLabelForContributorType(executiveDirectorProducerArray[0], true);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n \n //Customs\n customArray.forEach(item => {\n let thisName;\n\n if (isSecondary) {\n thisName = shared.getReverseCitationName(item);\n }\n else{\n thisName = shared.getReferenceName(item);\n }\n\n if (namesUsed < 19) {\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount, isSecondary) + thisName;\n }\n \n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n \n if(isSecondary){\n authorPart = authorPart + ',';\n }\n\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n \n namesUsed++;\n }\n else{\n if (namesUsed == authorCount - 1) {\n authorPart = authorPart + ',...'\n authorPart = authorPart + thisName;\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n }\n }\n });\n }\n \n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n return authorPart;\n}\n\nfunction getSeriesDatePart(refData){\n //(2015–2018).\n // - Years the series aired\n // - Uses an en dash (\"–\")\n // - Can include text (e.g., 2015–present)\n // - (2015–present)\n // - Ends with a period\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let cleanedDate = '';\n\n if (publicationDate.length == 0) {\n cleanedDate = 'n.d.';\n }\n else{\n cleanedDate = shared.fixPageDash(publicationDate);\n cleanedDate = cleanedDate.split(' ').join('');\n }\n\n let datePart = '(' + cleanedDate + ').';\n\n return datePart;\n}\n\nfunction getSeriesSourcePart(refData){\n //Production Company 1; Production Company 2; Production Company 3.\n let sourcePart = '';\n let publisherString = shared.getPublisherString(refData.publishers);\n \n if (publisherString != '.') {\n sourcePart = publisherString; \n }\n\n return sourcePart;\n}\n\nfunction getEpisodeTitlePart(refData){\n // - Title of the episode, not italicized (e.g., Who shot Mr. Burns? (Part one))\n // - Season & episode number in parentheses (Season 4, Episode 12)\n // - followed by \"[TV series episode]\"\n //Ex: Episode title (Season 3, Episode 21) [TV series episode].\n let titlePart = '';\n\n let title = shared.getStringValue(refData.episodeTitle);\n let seasonNumber = shared.getStringValue(refData.seasonNumber);\n let episodeNumber = shared.getStringValue(refData.episodeNumber);\n\n if (title.length > 0) {\n titlePart = title;\n\n if (seasonNumber.length > 0 || episodeNumber.length > 0) {\n titlePart = titlePart + ' (';\n\n if (seasonNumber.length > 0) {\n titlePart = titlePart + 'Season ' + seasonNumber;\n }\n\n if (episodeNumber.length > 0) {\n if (seasonNumber.length > 0) {\n titlePart = titlePart + ', ';\n }\n\n titlePart = titlePart + 'Episode ' + episodeNumber;\n }\n\n titlePart = titlePart + ')';\n }\n\n titlePart = titlePart + ' [TV series episode].'\n }\n\n return titlePart;\n}\n\nfunction getEpisodeAuthorPart(refData){\n //Authora, A. A. (Writer), Authorb, B. B. (Director), & Authorc, C. C. (Writer & Director).\n let authorPart = '';\n\n //order by: writer, director, then writer & director\n //then order by the way they are listed\n //custom at the end\n\n if (typeof refData.contributors === 'undefined') {\n return '';\n }\n\n if (refData.contributors.length == 0) {\n return '';\n }\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n let writerArray = [];\n let directorArray = [];\n let writerDirectorArray = [];\n let customArray = [];\n let authorCount = 0;\n let typeCount = 0;\n\n let typeAdded = false;\n _forEach(refData.contributors, (item) => {\n if (item.type == 'writer') {\n writerArray.push(item);\n authorCount++;\n\n if (!typeAdded) {\n typeCount++;\n typeAdded = true;\n }\n }\n });\n\n typeAdded = false;\n _forEach(refData.contributors, (item) => {\n if (item.type == 'director') {\n directorArray.push(item);\n authorCount++;\n\n if (!typeAdded) {\n typeCount++;\n typeAdded = true;\n }\n }\n });\n\n typeAdded = false;\n _forEach(refData.contributors, (item) => {\n if (item.type == 'writerDirector') {\n writerDirectorArray.push(item);\n authorCount++;\n\n if (!typeAdded) {\n typeCount++;\n typeAdded = true;\n }\n }\n });\n\n typeAdded = false;\n _forEach(refData.contributors, (item) => {\n if (item.type == 'custom') {\n customArray.push(item);\n authorCount++;\n\n if (!typeAdded) {\n typeCount++;\n typeAdded = true;\n }\n }\n });\n\n //not sure how this would be possible to have contribs not in this list, but whatever\n if (authorCount == 0) {\n return '';\n }\n\n //now based off the total number we have to process, loop through all arrays at once and build the strings\n if (authorCount == 1) {\n //only one in one of these arrays\n if (writerArray.length == 1) {\n let thisName = shared.getReferenceName(writerArray[0]);\n let thisLabel = getLabelForContributorType(writerArray[0], false);\n let thisFullName = thisName + ' (' + thisLabel + ')';\n\n authorPart = thisFullName;\n }\n\n if (directorArray.length == 1) {\n let thisName = shared.getReferenceName(directorArray[0]);\n let thisLabel = getLabelForContributorType(directorArray[0], false);\n let thisFullName = thisName + ' (' + thisLabel + ')';\n\n authorPart = thisFullName;\n }\n\n if (writerDirectorArray.length == 1) {\n let thisName = shared.getReferenceName(writerDirectorArray[0]);\n let thisLabel = getLabelForContributorType(writerDirectorArray[0], false);\n let thisFullName = thisName + ' (' + thisLabel + ')';\n\n authorPart = thisFullName;\n }\n\n if (customArray.length == 1) {\n let thisName = shared.getReferenceName(customArray[0]);\n let thisLabel = getLabelForContributorType(customArray[0], false);\n let thisFullName = thisName + ' (' + thisLabel + ')';\n\n authorPart = thisFullName;\n }\n }\n\n //2-20\n if (authorCount > 1 && authorCount < 21) {\n let namesUsed = 0;\n \n //Writer\n writerArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n\n namesUsed++;\n });\n\n if (writerArray.length > 0 && typeCount == 1) {\n let thisLabel = getLabelForContributorType(writerArray[0], true);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n\n //Director\n directorArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n\n namesUsed++;\n });\n\n if (directorArray.length > 0 && typeCount == 1) {\n let thisLabel = getLabelForContributorType(directorArray[0], true);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n\n //Writers and Directors\n writerDirectorArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n\n namesUsed++;\n });\n\n if (writerDirectorArray.length > 0 && typeCount == 1) {\n let thisLabel = getLabelForContributorType(writerDirectorArray[0], true);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n\n //Customs\n customArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n\n namesUsed++;\n });\n }\n\n //More Than Twenty\n if (authorCount > 20) {\n let namesUsed = 0;\n\n //Writers\n writerArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (namesUsed < 19) {\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n \n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n \n namesUsed++;\n }\n else{\n if (namesUsed == authorCount - 1) {\n authorPart = authorPart + ',...'\n authorPart = authorPart + thisName;\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n }\n }\n });\n \n if (writerArray.length > 0 && typeCount == 1 && (namesUsed < 19 || namesUsed == authorCount)) {\n let thisLabel = getLabelForContributorType(writerArray[0], true);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n \n //Directors\n directorArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (namesUsed < 19) {\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n \n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n \n namesUsed++;\n }\n else{\n if (namesUsed == authorCount - 1) {\n authorPart = authorPart + ',...'\n authorPart = authorPart + thisName;\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n }\n }\n });\n \n if (directorArray.length > 0 && typeCount == 1 && (namesUsed < 19 || namesUsed == authorCount)) {\n let thisLabel = getLabelForContributorType(directorArray[0], true);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n \n //Executive Directors and Producers\n writerDirectorArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (namesUsed < 19) {\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n \n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n \n namesUsed++;\n }\n else{\n if (namesUsed == authorCount - 1) {\n authorPart = authorPart + ',...'\n authorPart = authorPart + thisName;\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n }\n }\n });\n \n if (writerDirectorArray.length > 0 && typeCount == 1 && (namesUsed < 19 || namesUsed == authorCount)) {\n let thisLabel = getLabelForContributorType(writerDirectorArray[0], true);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n \n //Customs\n customArray.forEach(item => {\n let thisName = shared.getReferenceName(item);\n\n if (namesUsed < 19) {\n if (authorPart.length == 0) {\n authorPart = thisName; \n }\n else{\n authorPart = appendNameSeperator(authorPart, namesUsed, authorCount) + thisName;\n }\n \n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n \n namesUsed++;\n }\n else{\n if (namesUsed == authorCount - 1) {\n authorPart = authorPart + ',...'\n authorPart = authorPart + thisName;\n\n if (typeCount > 1) {\n let thisLabel = getLabelForContributorType(item, false);\n authorPart = authorPart + ' (' + thisLabel + ')';\n }\n }\n }\n });\n }\n \n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n return authorPart;\n}\n\nfunction getEpisodeDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getEpisodeSourcePart(refData){\n //In A. A. Authora, (Executive Director), D. D. Authord, (Executive Producer) & E. E. Authore, (Executive Producer), Series title. Production Copmany 1; Production Company 2; Production Company 3.\"\n // - Starts with \"In \"\n // - Then list secondary contributors\n // - Executive Directors (A. A. Authora, (Executive Director))\n // - Executive Producers (A. A. Authora, (Executive Producer))\n // - If there is only one kind of contributor with multiple people, list them togehter (A. A. Authora, & B. B. Authorb (Executive Producers)). We can't combine all roles into one if there are multiple contributor types.\n // - Role possibilites:\n // - Executive Director\n // - Executive Directors (multiple Ex. Director contributors only)\n // - Executive Producer\n // - Executive Producers (multiple Ex. Producer contributors only)\n // - Executive Director & Executive Producer\n // - Executive Directors & Executive Producers (multiple Ex. Director/Ex. Producer contributors only)\n // - Order of Contributor Roles\n // - Executive Directors\n // - Executive Producer\n // - Executive Director & Producer\n // - Custom\n // - Follow with a comma\n // - Title of the series in italics ()The wire), followed by a period\n // - Production Company Names, separated by semi-colons if multiple (publishers)\n // - End with a period\n\n let sourcePart = '';\n\n //this is a different way of doing this, but this is a different type\n //we're going to re0use the author part for series with a few tweaks in that method\n let secondaryContributorString = getSeriesAuthorPart(refData, true);\n let title = shared.getStringValue(refData.title);\n let publisherString = shared.getPublisherString(refData.publishers);\n\n //remove the period if we have one\n if (secondaryContributorString.endsWith('.')) {\n secondaryContributorString = secondaryContributorString.substring(0, secondaryContributorString.length - 1);\n }\n \n if (secondaryContributorString.length > 0 || title.length > 0 || publisherString != '.') {\n sourcePart = 'In'; \n }\n\n if (secondaryContributorString.length > 0) {\n sourcePart = sourcePart + ' ' + secondaryContributorString;\n }\n\n if (title.length > 0) {\n if (secondaryContributorString.length > 0) {\n sourcePart = sourcePart + ',';\n }\n \n if (!title.startsWith('[')) {\n title = title.italicize();\n }\n \n sourcePart = sourcePart + ' ' + title + '.';\n }\n\n if (publisherString.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n \n sourcePart = sourcePart + publisherString;\n }\n\n if (!sourcePart.endsWith('.')) {\n sourcePart = sourcePart + '.';\n }\n\n return sourcePart;\n}\n\nfunction getLabelForContributorType(contributor, isPlural){\n\n let label = '';\n\n switch (contributor.type) {\n case 'executiveProducer':\n\n if (isPlural) {\n label = 'Executive Producers';\n }\n else{\n label = 'Executive Producer';\n }\n\n break;\n case 'executiveDirector':\n\n if (isPlural) {\n label = 'Executive Directors';\n }\n else{\n label = 'Executive Director';\n }\n\n break;\n case 'executiveDirectorProducer':\n \n if (isPlural) {\n label = 'Executive Directors & Executive Producers';\n }\n else{\n label = 'Executive Director & Executive Producer';\n }\n;\n break;\n case 'director':\n\n if (isPlural) {\n label = 'Directors';\n }\n else{\n label = 'Director';\n }\n\n break;\n case 'writer':\n\n if (isPlural) {\n label = 'Writers';\n }\n else{\n label = 'Writer';\n }\n\n break;\n case 'writerDirector':\n\n if (isPlural) {\n label = 'Writers & Directors';\n }\n else{\n label = 'Writer & Director';\n }\n break;\n case 'custom':\n label = contributor.name;\n break;\n }\n\n return label;\n}\n\nfunction appendNameSeperator(nameString, namesUsed, authorCount, isSecondary){\n\n //repetive logic I'm trying to re-use will all these different name types\n if (namesUsed == authorCount - 1) {\n\n //if three or more, add comma \n //or if the names are primary, then, add comma before any\n if (isSecondary && authorCount > 2) {\n nameString = nameString + ','\n }\n\n if (!isSecondary && authorCount > 1) {\n nameString = nameString + ','\n }\n\n nameString = nameString + ' & '\n }\n else{\n\n if (nameString.endsWith(',')) {\n nameString = nameString + ' '\n }\n else{\n nameString = nameString + ', '\n }\n }\n\n return nameString;\n}","/*\n*****Testimonies*****\n \n*/\n\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n\n let title = shared.getStringValue(refData.title);\n let committeeName = shared.getStringValue(refData.committeeName);\n let session = shared.getStringValue(refData.session);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let contributorString = shared.getReferenceNameString(refData.contributors, true);\n let url = shared.getStringValue(refData.url);\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n referenceValue = title;\n }\n else{\n\n if (refData.type == 'hearing' && committeeName.length > 0) {\n title = title + ': Hearing before the ' + committeeName; \n }\n\n referenceValue = title.italicize();\n }\n }\n\n if (refData.type == 'testimony' && committeeName.length > 0) {\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ', ';\n }\n\n referenceValue = referenceValue + committeeName.italicize();\n }\n\n if (session.length > 0) {\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ',';\n }\n\n session = shared.getOrdinalValue(session);\n\n referenceValue = referenceValue + ' ' + session;\n referenceValue = referenceValue + ' Cong.'\n }else{\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + '.';\n } \n }\n\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' ';\n }\n\n if (publicationDate.length > 0) {\n publicationDate = shared.getYear(publicationDate);\n referenceValue = referenceValue + '(' + publicationDate + ')';\n }\n else{\n referenceValue = referenceValue + '(n.d.)';\n }\n\n if (contributorString.length > 0) {\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' (testimony of ';\n referenceValue = referenceValue + contributorString;\n referenceValue = referenceValue + ')';\n }\n }\n\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + '.';\n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n referenceValue = referenceValue + ' ' + url;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: '',\n datePart: ''\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData) {\n let authorString = '';\n\n let title = shared.getStringValue(refData.title);\n let shortTitle = shared.getStringValue(refData.shortTitle);\n let year = shared.getYear(refData.publicationDate);\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n if (shortTitle.length > 0) {\n title = shortTitle;\n }\n\n if (!title.startsWith('[')) {\n title = shared.stripSubtitle(title);\n title = title.toTitleCase().italicize(); \n }\n\n let citation = shared.getCitations(citationData, title, year, []);\n\n return citation;\n}","/*\n*****TestsScales*****\n \nFORM: https://docs.google.com/spreadsheets/d/1u-C3PKXFayjzdGHcyaaj1PJS6sENHjQ4SGB_-YfUcDw/edit#gid=2071428744\nMOCKUP: https://magical-design-system.webflow.io/add-in/wizard/wizard-2-tests-scales-inventories\n\nTYPES:\n manual\n - Citing a manual for a test, inventory, or scale\n [contributors]. ([publicationDate]). [title] ([contributors.editor]). [publisher.reference]. [url]\n direct\n - Citing a test, inventory, or scale directly (when the manual isn't available)\n [contributors.groupAuthor]. [publicationDate]. [title]. [publisher.reference]. [url]\n record\n - Citing a database record for a test\n [contributors]. ([publicationDate]). [title] ([number]) [Database record]. [publisher.reference]. [url]\n\n\n\nAuthorPart\n - List primary contributors (Authors & Group Authors like normal)\n\nDatePart\n - Date is listed as YYYY\n\nTitlePart\n - Title is in Title Case (not sentence case). This is the same for citations without contributors and with a title.\n - \"record\" also includes [number] in parentheses, followed by \"[Database record]\". \n\nSourcePart\n - Publishers are listed like normal.\n - URLs are also listed normally.\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'groupAuthor' || item.type == 'chapterAuthor' || item.type == 'userName') {\n authorArray.push(item);\n }\n });\n \n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n let type = shared.getStringValue(refData.type);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n \n let editorArray = shared.getEditors(refData.contributors);\n \n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n else{\n let title = shared.getStringValue(refData.title);\n \n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n authorString = title.italicize(); \n }\n }\n }\n \n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n else{\n year = shared.fixPageDash(year);\n }\n \n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n \n return citation;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0) {\n if (!authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n let type = shared.getStringValue(refData.type);\n let title = shared.getStringValue(refData.title);\n let number = shared.getStringValue(refData.number);\n \n if (title.length > 0) {\n\n if (title.startsWith('[')) {\n titlePart = title;\n }\n else{\n titlePart = title.italicize(); \n }\n }\n\n if (number.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' '; \n }\n\n titlePart = titlePart + '(' + number + ')';\n }\n\n if (type == 'record') {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' '; \n }\n\n titlePart = titlePart + '[Database record]';\n }\n\n //editors\n let editorArray = shared.getEditors(refData.contributors);\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n\n if (editorString.length > 0) {\n if (titlePart.length > 0) {\n titlePart = titlePart + ' '; \n }\n titlePart = titlePart + '(' + editorString + ')';\n }\n\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart);\n }\n\n return titlePart;\n}\n\nfunction getSourcePart(refData){\n let sourcePart = '';\n let url = shared.getStringValue(refData.url);\n let publisherString = shared.getPublisherString(refData.publishers);\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, true);\n\n if (publisherString != '.') {\n if (publisherString != authorString && (publisherString != authorString + '.')) {\n sourcePart = publisherString; \n } \n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}","/*\n*****Treaties*****\n \nFORM: https://docs.google.com/spreadsheets/d/1XGB83pKU9cpLa3majkj1G4ViGsBIZZjIEu0OMNxkzVg/edit#gid=2071428744\nMOCKUP: https://magical-design-system.webflow.io/add-in/wizard/wizard-2-international-conventions-treaties\n\nType & Kind Questions\n*** There are no types/kinds\n\n[title], [publicationDate], [url]\n\n**If there isn't a URL, end with a period.\n\n*/\n\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n \n let title = shared.getStringValue(refData.title);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let url = shared.getStringValue(refData.url);\n\n if (title.length > 0) {\n referenceValue = title;\n }\n\n if (publicationDate.length > 0) {\n if (title.length > 0) {\n referenceValue = referenceValue + ', ';\n }\n let formattedDate = shared.getReverseFullDate(publicationDate);\n\n referenceValue = referenceValue + formattedDate;\n }\n else{\n if (title.length > 0) {\n referenceValue = referenceValue + ', n.d.';\n }\n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ', ';\n }\n\n referenceValue = referenceValue + url;\n }\n else{\n if (referenceValue.length > 0) {\n if (!referenceValue.endsWith('.')) {\n referenceValue = referenceValue + '.';\n }\n }\n }\n\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: '',\n datePart: ''\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData) {\n let title = shared.getStringValue(refData.title);\n let year = shared.getYear(refData.publicationDate);\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n let citation = shared.getCitations(citationData, title, year, []);\n\n return citation;\n}\n\n//TODO: Create private methods for each part","/*\n*****USFederalCourtCases*****\n \nDocumentation: \nFORM: https://docs.google.com/spreadsheets/d/1c49E2DLcu6thGJDIfUBg9ysD1ToSv5XzgrjEQYir9Z4/edit#gid=1084144617\nMOCKUP: http://magical-design-system.webflow.io/add-in/wizard/wizard-2-federal-court-cases\n\nType & Kind Questions\n Types:\n - supreme\n - circuit\n - district\n - appealed\n\n Kinds:\n - affirmed: This is only used for the \"appealed\" type.\n - overturned: This is only used for the \"appealed\" type.\n\nSupreme\n [title], [volume] U.S. [pageNumber] ([publicationDate]). [url]\n\n PageNumber: If there isn't a page number passed, put three underscores \"___\". \n\nCircuit\n [title], [volume] F.[series] [pageNumber] ([circuit] Cir. [publicationDate]). [url]\n\n Series: This is a dropdown that will pass \"first\", \"second\", or \"third\". First will show as \"F.\". Second will be \"F.2d\". Third is \"F.3d\".\n\nDistrict\n [title], [volume] F. Supp.[series] [pageNumber] ([district] [publicationDate]). [url]\n\n Series: This is a dropdown that will pass \"first\", \"second\", or \"third\". First will show as \"F. Supp.\". Second will be \"F. Supp. 2d\". Third is \"F. Supp. 3d\".\n\nAppealed Affirmed\n [title], [volume] F. Supp.[series] [pageNumber] ([district] [publicationDate]), aff'd [appealVolume] F.[appealSeries] [appealPageNumber] ([circuit] Cir. [appealPublicationDate]). [url]\n\n Series follows the pattern for District. AppealSeries follows the pattern for Circuit.\n\nAppealed Overturned\n [title], [volume] F. Supp.[series] [pageNumber] ([district] [publicationDate]), rev'd [appealVolume] F.[appealSeries] [appealPageNumber] ([circuit] Cir. [appealPublicationDate]). [url]\n\n Series follows the pattern for District. AppealSeries follows the pattern for Circuit.\n\n*/\n\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0) {\n return 'Type required.';\n }\n\n let title = shared.getStringValue(refData.title);\n let volume = shared.getStringValue(refData.volume);\n let pageNumber = shared.getStringValue(refData.pageNumber);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let url = shared.getStringValue(refData.url);\n let series = shared.getStringValue(refData.series);\n let circuit = shared.getStringValue(refData.circuit);\n let district = shared.getStringValue(refData.district);\n\n let label = '';\n\n switch (type) {\n case 'supreme':\n label = 'U.S.';\n break;\n case 'circuit':\n label = 'F.';\n\n if (series.length > 0) {\n let seriesAbbreviation = getSeriesAbbreviation(series);\n\n if(seriesAbbreviation.length > 0){\n label = label + seriesAbbreviation;\n }\n }\n\n break;\n case 'district':\n case 'appealed':\n label = 'F. Supp.';\n\n if (series.length > 0) {\n let seriesAbbreviation = getSeriesAbbreviation(series);\n\n if(seriesAbbreviation.length > 0){\n label = label + ' ' + seriesAbbreviation;\n }\n }\n break;\n \n }\n\n //if there are no pagenumbers, set this to ___\n if (pageNumber.length == 0) {\n pageNumber = '___';\n }\n\n if (publicationDate.length == 0) {\n publicationDate = 'n.d.';\n }\n\n if (title.length > 0) {\n referenceValue = title;\n }\n\n if (volume.length > 0) {\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ', '\n }\n\n referenceValue = referenceValue + volume;\n }\n\n if (label.length > 0) {\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' '\n }\n\n referenceValue = referenceValue + label;\n }\n\n if (pageNumber.length > 0) {\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' '\n }\n\n referenceValue = referenceValue + pageNumber;\n }\n\n if (publicationDate.length > 0 || circuit.length > 0 || district.length > 0) {\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' '\n }\n\n referenceValue = referenceValue + '(';\n\n if (district.length > 0) {\n referenceValue = referenceValue + district;\n\n if (publicationDate.length > 0) {\n referenceValue = referenceValue + ' ';\n }\n }\n\n if (circuit.length > 0) {\n referenceValue = referenceValue + circuit + ' Cir.';\n\n if (publicationDate.length > 0) {\n referenceValue = referenceValue + ' ';\n }\n }\n\n if (publicationDate.length > 0) {\n referenceValue = referenceValue + publicationDate;\n }\n\n referenceValue = referenceValue + ')';\n }\n\n if (type == 'appealed') {\n referenceValue = referenceValue + ', ';\n //aff'd, 321 F.2d 654 (9th Cir. 2019).\n let appealedLabel = '';\n\n if (kind == 'affirmed') {\n appealedLabel = 'aff\\'d';\n }\n\n if (kind == 'overturned') {\n appealedLabel = 'rev\\'d';\n }\n\n referenceValue = referenceValue + appealedLabel;\n\n let appealVolume = shared.getStringValue(refData.appealVolume);\n let appealSeries = shared.getStringValue(refData.appealSeries);\n let appealPageNumber = shared.getStringValue(refData.appealPageNumber);\n let appealDate = shared.getStringValue(refData.appealDate);\n let appealCircuit = shared.getStringValue(refData.appealCircuit);\n\n if (appealPageNumber.length == 0) {\n appealPageNumber = '___';\n }\n\n if (appealVolume.length > 0 || appealSeries.length > 0 || appealPageNumber.length > 0 || appealDate.length > 0 || appealCircuit.length > 0) {\n referenceValue = referenceValue + ','\n\n if (appealVolume.length > 0) {\n referenceValue = referenceValue + ' ' + appealVolume;\n }\n\n if (appealSeries.length > 0) {\n referenceValue = referenceValue + ' F.' + getSeriesAbbreviation(appealSeries);\n }\n\n if (appealPageNumber.length > 0) {\n referenceValue = referenceValue + ' ' + appealPageNumber;\n }\n\n if (appealCircuit.length > 0 || appealDate.length > 0) {\n referenceValue = referenceValue + ' (';\n\n if (appealCircuit.length > 0) {\n referenceValue = referenceValue + appealCircuit + ' Cir.';\n\n if (appealDate.length) {\n referenceValue = referenceValue + ' ';\n }\n }\n\n if (appealDate.length) {\n referenceValue = referenceValue + appealDate;\n }\n\n referenceValue = referenceValue + ')'\n }\n\n referenceValue = referenceValue + '.'\n }\n else{\n referenceValue = referenceValue + '.'\n }\n\n }\n else{\n referenceValue = referenceValue + '.';\n }\n \n if (url.length) {\n url = shared.formatURL(url);\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' ';\n }\n\n referenceValue = referenceValue + url;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: '',\n datePart: ''\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData) {\n let authorString = '';\n let title = shared.getStringValue(refData.title);\n let year = shared.getYear(refData.publicationDate);\n let appealDate = shared.getYear(refData.appealDate);\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n if (appealDate.length > 0) {\n year = year + '/' + appealDate;\n }\n\n if (title.length > 0) {\n authorString = title.italicize();\n }\n\n let citation = shared.getCitations(citationData, authorString, year, []);\n\n return citation;\n}\n\nfunction getSeriesAbbreviation(series){\n let abbreviation = '';\n\n switch (series) {\n case 'second':\n abbreviation = '2d'\n break;\n case 'third':\n abbreviation = '3d'\n break;\n case 'fourth':\n abbreviation = '4th'\n break;\n }\n\n return abbreviation;\n}","/*\n*****USStateCourtCases*****\n \nDocumentation:\nFORM: https://docs.google.com/spreadsheets/d/1FAxGIq3vCU6zLwMZ1NYFD-JrWdegcBPhgnyn6wP2VHs/edit\nMOCKUP: http://magical-design-system.webflow.io/add-in/wizard/wizard-2-state-court-case\n\nType & Kind Questions\n There are no types or kinds.\n\nTODO:\n [title], [citation.volume] [citation.series] [citation.pageNumber] ([court] [publicationDate]). [url]\n\n title: This is the case name. Name v. Name\n citation:\n volume: The volume number of the series.\n series: The abbreviated name of the series where the case was published.\n pageNumber: The starting page number of the case.\n court: The abbreviated name of the court where the case was held (if applicable).\n publicationDate: The date the verdic was rendered.\n url: The url if applicable.\n\n*/\n\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n let title = shared.getStringValue(refData.title);\n let citations = getCitationString(refData.citation);\n let court = shared.getStringValue(refData.court);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let url = shared.getStringValue(refData.url);\n\n if (publicationDate.length == 0) {\n publicationDate = 'n.d.';\n }\n\n if (title.length > 0) {\n referenceValue = title;\n }\n\n if (citations.length > 0) {\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ', ';\n }\n\n referenceValue = referenceValue + citations;\n }\n else{\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ',';\n }\n }\n\n if (court.length > 0 || publicationDate.length > 0) {\n\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' ';\n }\n\n referenceValue = referenceValue + '(';\n\n if (court.length > 0) {\n referenceValue = referenceValue + court;\n\n if (publicationDate.length > 0) {\n referenceValue = referenceValue + ' ';\n }\n }\n\n if (publicationDate.length > 0) {\n referenceValue = referenceValue + publicationDate;\n }\n\n referenceValue = referenceValue + ')';\n }\n\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + '.';\n }\n\n if (url.length) {\n url = shared.formatURL(url);\n if (referenceValue.length > 0) {\n referenceValue = referenceValue + ' ';\n }\n\n referenceValue = referenceValue + url;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: '',\n datePart: ''\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData) {\n let authorString = '';\n let title = shared.getStringValue(refData.title);\n let year = shared.getYear(refData.publicationDate);\n let appealDate = shared.getYear(refData.appealDate);\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n if (appealDate.length > 0) {\n year = year + '/' + appealDate;\n }\n\n if (title.length > 0) {\n authorString = title.italicize();\n }\n\n let citation = shared.getCitations(citationData, authorString, year, []);\n\n return citation;\n}\n\nfunction getCitationString(citations){\n var citationString = '';\n\n if (typeof citations === 'undefined') {\n return citationString;\n }\n\n if (citations.length > 0) {\n\n citations.forEach(item => {\n \n \n let volume = shared.getStringValue(item.volume);\n let series = shared.getStringValue(item.series);\n let pageNumber = shared.getStringValue(item.pageNumber);\n let thisCitation = '';\n\n //if there are no pagenumbers, set this to ___\n if (pageNumber.length == 0) {\n pageNumber = '___';\n }\n\n if (volume.length > 0) {\n thisCitation = volume;\n }\n\n if (series.length > 0) {\n if (thisCitation.length > 0) {\n thisCitation = thisCitation + ' ';\n }\n\n thisCitation = thisCitation + series;\n }\n\n if (pageNumber.length > 0) {\n if (thisCitation.length > 0) {\n thisCitation = thisCitation + ' ';\n }\n\n thisCitation = thisCitation + pageNumber;\n }\n\n if (citationString.length > 0 && thisCitation.length > 0) {\n citationString = citationString + ', ';\n }\n\n if (thisCitation.length > 0) {\n citationString = citationString + thisCitation;\n }\n });\n }\n\n return citationString;\n}","/*\n*****Videos*****\n \nDocumentation: https://docs.google.com/spreadsheets/d/1ODFPbTjf6GS654md6Q30E3ReRSqBqM5kw56RMQ72re8/edit#gid=1084144617\n\nType & Kind Questions\n- TYPES\n - [streaming]: A streaming (online) video\n - [webinar]: A recorded webinar\n\n- KINDS\n - [posted]: for [streaming] - a video posted on a streaming site\n - [hosted]: for [streaming] - a video on its own website\n - No kinds for webinar\n\nTODO: Document the parts and their fields here\nAuthorPart\n - Contributors\n - [contributor.author] - Normal individual name\n - [contributor.groupAuthor] - Normal Group Author\n - [contributor.userName] - Normal username\n - Ends with a period\n\nDatePart\n - [publicationDate]\n - This can be a year or a full date, but we're asking for a full date\n - ends with a period\n\nTitlePart\n - [title]\n - title is italicized\n - followed by the format \"[Video]\" or \"[Webinar]\"\n - ends with a period\n\nSourcePart\n - [publisher.reference]\n - There's only ever one\n - followed by a period\n - URL at the end\n\n*/\nconst _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let referenceValue = '';\n \n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value: referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs) {\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'userName' || item.type == 'groupAuthor') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n \n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n let title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n title = shared.stripSubtitle(title);\n\n if (title.startsWith('[')) {\n authorString = title;\n }\n else{\n authorString = title.toTitleCase().italicize(); \n }\n }\n else{\n let description = shared.getStringValue(refData.description);\n\n if (description.length > 0) {\n authorString = description.bracket();\n }\n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n if (citationData.type == 'time') {\n citationData.value = shared.fixTimeCitationData(citationData.value);\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n //since time is treated differently here than from other places, replace / with :\n if (citationData.type == 'time') {\n citation.first = citation.first.split(\"/\").join(\":\");\n citation.subsequent = citation.subsequent.split(\"/\").join(\":\");\n }\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n // - [title]\n // - title is italicized\n // - followed by the format \"[Video]\" or \"[Webinar]\"\n // - ends with a period\n //Video title [Video].\n\n let titlePart = '';\n let title = shared.getStringValue(refData.title);\n let format = '';\n\n if (title.length > 0) {\n\n if (title.startsWith('[')) {\n titlePart = title; \n }\n else{\n titlePart = title.italicize(); \n }\n }\n else{\n let description = shared.getStringValue(refData.description);\n\n if (description.length > 0) {\n titlePart = description.bracket();\n }\n }\n\n switch (refData.type) {\n case 'streaming':\n format = '[Video]';\n break;\n case 'webinar':\n format = '[Webinar]';\n break;\n }\n\n if (format.length > 0) {\n titlePart = titlePart + ' ' + format;\n }\n\n titlePart = shared.fixTitlePartClosure(titlePart);\n\n return titlePart;\n}\n\nfunction getAuthorPart(refData){\n let authorArray = shared.getAuthors(refData.contributors);\n let authorString = shared.getReferenceNameString(authorArray, false);\n\n let authorPart = authorString;\n\n if (authorPart.length > 0 && !authorPart.endsWith(\".\")) {\n authorPart = authorPart + '.'\n }\n\n if (authorPart.length == 0) {\n\n let editorArray = shared.getEditors(refData.contributors);\n //if there is not author, we need to check editors, unless this is an entry\n if (editorArray.length > 0 && refData.type != 'entry') {\n authorPart = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n authorPart = authorPart + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n authorPart = authorPart + ' (Eds.).';\n }\n }\n }\n }\n\n return authorPart;\n}\n\nfunction getDatePart(refData){\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let formattedDate = shared.getFullDate(publicationDate);\n\n let datePart = '(' + formattedDate + ').';\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n //Platform Title. https://www.perrla.com/video\n // - [publisher.reference]\n // - There's only ever one\n // - followed by a period\n // - URL at the end\n\n let sourcePart = '';\n let publisherString = shared.getPublisherString(refData.publishers);\n let authorPart = getAuthorPart(refData);\n let url = shared.getStringValue(refData.url);\n\n if (publisherString != '.' && publisherString != authorPart) {\n sourcePart = publisherString; \n }\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' ';\n }\n\n sourcePart = sourcePart + url;\n }\n\n return sourcePart;\n}","const _forEach = require('lodash/forEach');\nconst shared = require('./APA7-Shared.js');\nconst dateHelper = require('../dateHelper');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference (refData){\n var referenceValue = '';\n\n //Basic Format\n //Author Part - authorString \n //Example: Authora, A. A., & Authorb, B. B., Jr.\n\n //Date Part - (publicationDate).\n //Example: (2018, April 15).\n\n //Title Part - pageTitle [translatedTitle] [format] (translatorsString).\n //Example: Mi bùsqueda de Sasquatch [My search for Sasquatch] (A. A. Translatora, Trans.). \n\n //Source Part - websiteTitle. Retrieved retrievalDate from url\n //Example: Cryptozoology Online Today. Retrieved May 15, 2019 from https://www.cryptozoologytoday.com/sasquatch/search_for_the_truth/\n\n //for authors, we need to limit this to Authors and usernames\n ///*****Author Part ******/\n let authorArray = [];\n\n if (typeof refData.contributors != 'undefined') {\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'userName' || item.type == 'groupAuthor') {\n authorArray.push(item);\n }\n });\n }\n\n let authorPart = shared.getReferenceNameString(authorArray, false);\n let editorsUsedInAuthorPart = false;\n\n if (authorPart.length == 0) {\n //editors\n let editorArray = shared.getEditors(refData.contributors);\n let editorString = shared.getEditorsAtStartofRefString(editorArray);\n\n if (editorArray.length == 1) {\n editorString = editorString + ' (Ed.).';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ' (Eds.).';\n }\n }\n\n if (editorString.length > 0) {\n authorPart = editorString;\n editorsUsedInAuthorPart = true;\n }\n }\n\n if (authorPart.length > 0 && !authorPart.endsWith('.')) {\n authorPart = authorPart + '.';\n }\n\n ///*****Date Part ******/\n //default the pub date to n.d. if we don't have one\n let publicationDate = shared.getStringValue(refData.publicationDate);\n\n if (publicationDate.length == 0) {\n publicationDate = 'n.d.';\n }\n else{\n if (refData.publicationDate.includes(\"/\")) {\n var array = refData.publicationDate.split(\"/\");\n\n switch (array.length) {\n case 1:\n publicationDate = array[0];\n break;\n\n case 2:\n\t\t\t\t\tpublicationDate = dateHelper.format(array[0] + '/1/' + array[1], 'yyyy, mmmm'); \n break;\n \n default:\n if (refData.publicationDate.endsWith(\"/\")) {\n publicationDate = dateHelper.format(refData.publicationDate, 'mmmm d');\n }\n else{\n publicationDate = dateHelper.format(refData.publicationDate, 'yyyy, mmmm d');\n }\n \n break;\n }\n\n }\n else{\n publicationDate = refData.publicationDate;\n }\n }\n\n let datePart = '(' + publicationDate + ').';\n\n ///*****Title Part ******/\n let title = shared.getStringValue(refData.pageTitle);\n\n let titlePart = \"\";\n\n if (title.length > 0) {\n titlePart = title.italicize()\n }\n\n //translated title\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (translatedTitle.length > 0) {\n titlePart = titlePart + ' [' + translatedTitle + ']';\n }\n\n //editors\n if (!editorsUsedInAuthorPart) {\n let editorArray = shared.getEditors(refData.contributors);\n let editorString = shared.getReferenceNameString(editorArray, true);\n\n if (editorArray.length == 1) {\n editorString = editorString + ', Ed.';\n }\n else{\n if (editorArray.length > 1) {\n editorString = editorString + ', Eds.';\n }\n }\n\n if (editorString.length > 0) {\n titlePart = titlePart + ' (' + editorString + ')';\n } \n }\n\n //format\n let format = shared.getStringValue(refData.format);\n \n if (format.length > 0) {\n titlePart = titlePart + ' [' + format + ']';\n }\n\n //translators\n let translatorString = shared.getTranslatorString(refData.contributors);\n\n if (translatorString.length > 0) {\n titlePart = titlePart + ' (' + translatorString + ')';\n }\n\n if (titlePart.length > 0) {\n titlePart = shared.fixTitlePartClosure(titlePart); \n }\n\n ///*****Source Part ******/\n let websiteTitle = shared.getStringValue(refData.websiteTitle);\n let url = shared.getStringValue(refData.url);\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n let sourcePart = '';\n\n if (websiteTitle.length > 0) {\n if (websiteTitle.replaceAll(\"’\", \"'\") + '.' != authorPart.replaceAll(\"’\", \"'\")) {\n sourcePart = websiteTitle + '.' \n }\n }\n\n if (retrievalDate.length > 0) {\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' '; \n }\n\n sourcePart = sourcePart + 'Retrieved';\n sourcePart = sourcePart + ' ' + shared.formatRetrievalDate(retrievalDate); \n sourcePart = sourcePart + ', from' ;\n }\n\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ' '; \n }\n\n url = shared.formatURL(url);\n sourcePart = sourcePart + url ;\n\n //build the reference from the parts\n var referenceValue;\n\n if (authorPart.length == 0) {\n //no contributors\n referenceValue = titlePart + ' ' + datePart + ' ' + sourcePart; \n }\n else{\n referenceValue = authorPart + ' ' + datePart + ' ' + titlePart + ' ' + sourcePart;\n }\n\n let reference = {\n value : referenceValue.trim(),\n orderByValue: shared.getOrderByValue(referenceValue),\n isPrintedOnReferencePage: true,\n authorPart: authorPart,\n datePart: datePart\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData, paperRefs){\n\n // (Author, YYYY, location)\n //for authors, we need to limit this to Authors and usernames\n let authorArray = [];\n\n _forEach(refData.contributors, (item) => {\n if (item.type == 'author' || item.type == 'userName' || item.type == 'groupAuthor') {\n authorArray.push(item);\n }\n });\n\n let authorString = shared.getCitationAuthorString(authorArray, false, paperRefs);\n let year = shared.getYear(refData.publicationDate);\n // let location = shared.getCitationLocationString(citationData);\n\n if (authorString.length == 0) {\n let editorArray = shared.getEditors(refData.contributors);\n\n if (editorArray.length > 0) {\n authorString = shared.getCitationAuthorString(editorArray, false, paperRefs);\n }\n }\n\n //if there is not author string, we need to use the title\n if (authorString.length == 0) {\n\n if (refData.pageTitle.length > 0) {\n authorString = refData.pageTitle.toTitleCase().italicize(); \n }\n }\n\n //if there is no year, use n.d.\n if (year.length == 0) {\n year = 'n.d.';\n }\n\n let citation = shared.getCitations(citationData, authorString, year, authorArray);\n\n return citation;\n}","const apa7engine = require('./APA7/APA7-Engine.js');\nconst apa7specialrules = require('./APA7/APA7-SpecialRules.js');\n\nconst mla9engine = require('./MLA9/MLA9-Engine.js');\nconst mla9specialrules = require('./MLA9/MLA9-SpecialRules.js');\n\nconst turabian9engine = require('./Turabian9/Turabian9-Engine.js');\nconst turabian9specialrules = require('./Turabian9/Turabian9-SpecialRules.js');\n\nconst _cloneDeep = require('lodash/cloneDeep');\n\nmodule.exports = {\n getReference,\n getCitation,\n specialRules\n};\n\nfunction getReference(type, refData, mode){\n\n //swap the ID to the short name from types.json\n let typeShortName = getTypeShortName(type);\n\n if (typeShortName.length == 0) {\n throw 'Invalid Reference Type';\n }\n\n let runAPA7 = canExecuteFormat('APA7', type, mode);\n let runMLA9 = canExecuteFormat('MLA9', type, mode);\n let runTurabian9 = canExecuteFormat('Turabian9', type, mode);\n\n let reference = new Object();\n //pass this off to the reference factories\n\n if (runAPA7) {\n reference.apa7 = apa7engine.getReference(typeShortName, refData); \n }\n\n if (runMLA9) {\n reference.mla9 = mla9engine.getReference(typeShortName, refData); \n }\n\n if (runTurabian9) {\n reference.turabian9 = turabian9engine.getReference(typeShortName, refData); \n }\n\n return reference;\n}\n\nfunction getCitation(type, refData, citationData, mode){\n\n //swap the ID to the short name from types.json\n let typeShortName = getTypeShortName(type);\n\n if (typeShortName.length == 0) {\n throw 'Invalid Reference Type';\n }\n\n let runAPA7 = canExecuteFormat('APA7', type, mode);\n let runMLA9 = canExecuteFormat('MLA9', type, mode);\n let runTurabian9 = canExecuteFormat('Turabian9', type, mode);\n\n let citation = new Object();\n\n if (runAPA7) {\n citation.apa7 = apa7engine.getCitation(typeShortName, refData, citationData);\n }\n\n if (runMLA9) {\n citation.mla9 = mla9engine.getCitation(typeShortName, refData, citationData);\n }\n\n if (runTurabian9) {\n citation.turabian9 = turabian9engine.getCitation(typeShortName, refData, citationData); \n }\n\n //pass this off to the APA 7 factory\n // let apa7Citation = apa7engine.getCitation(typeShortName, refData, citationData);\n\n // let citation = {\n // apa7 : apa7Citation\n // }\n\n return citation;\n}\n\nfunction getTypeShortName(id){\n //swap the ID to the short name from types.json\n var typeData = require('./types.json');\n let typeShortName = '';\n\n typeData.refTypes.forEach(thisType => {\n if (thisType.id == id) {\n typeShortName = thisType.shortname;\n }\n });\n\n return typeShortName;\n}\n\nfunction specialRules(format, references){\n\tlet returnReferences = [];\n\n\tlet _references = _cloneDeep(references);\n\t\n\t// check the format of the reference data\n\t_references.forEach((referenceObject)=>{\n\t\ttry {\n\t\t\t// let parsedRefData = JSON.parse(referenceObject.data);\n\n let parsedRefData;\n if (typeof referenceObject.data === 'string') {\n parsedRefData = JSON.parse((referenceObject.data));\n }\n else{\n parsedRefData = referenceObject.data;\n }\n\n\t\t\tif(!Array.isArray(parsedRefData.contributors)){\n\t\t\t\tconst contributorPropertyNames = Object.values(parsedRefData.contributors);\n\t\t\t\t// console.log('parsedRefData needs contributor converted to array');\n\t\t\t\t// console.log('contributorPropertyNames');\n\t\t\t\t// console.log(contributorPropertyNames);\n\t\t\t\tparsedRefData.contributors = contributorPropertyNames;\n\t\t\t\treferenceObject.data = JSON.stringify(parsedRefData);\n\t\t\t}\n\t\t} catch(error){\n\t\t\tconsole.log(error);\n\t\t}\n\t});//forEach\n\n\tswitch (format) {\n\t\tcase 7: //APA 7\n\t\t\treturnReferences = apa7specialrules.specialRules(_references);\n\t\t\tbreak;\n\t\tcase 8: //MLA 9\n\t\t\treturnReferences = mla9specialrules.specialRules(_references);\n\t\t\tbreak;\n\t\tcase 9: //Turabian 9\n\t\t\treturnReferences = turabian9specialrules.specialRules(_references);\n\t\t\tbreak;\n\t}\n\treturn returnReferences;\n}\n\nfunction canExecuteFormat(format, type, executingMode){\n \n //if mode is not passed in, then only generate the available types\n if (typeof executingMode === 'undefined') {\n executingMode = 'available';\n }\n\n //only run this if our executing mode is \n let modeLevels = ['unavailable', 'dev', 'test', 'available'];\n\n let executingLevel = 0;\n let typeLevel = 0;\n\n type = parseInt(type);\n\n //get the executing level of our process\n for (i = 0; i < modeLevels.length; i++) {\n if (modeLevels[i] === executingMode) {\n executingLevel = i;\n break;\n }\n }\n\n //get the level for this type\n var typeData = require('./types.json');\n let typeMode = '';\n\n typeData.refTypes.forEach(thisType => {\n if (thisType.id === type) {\n typeMode =thisType.formats[format];\n }\n });\n\n if (typeMode.length > 0) {\n for (i = 0; i < modeLevels.length; i++) {\n if (modeLevels[i] === typeMode) {\n typeLevel = i;\n break;\n }\n } \n }\n\n //only tests that are not unavailable\n //and are at this executing level or higher\n\n let canExecuteFormat = false;\n\n if (typeLevel > 0) {\n if (typeLevel >= executingLevel) {\n canExecuteFormat = true;\n }\n }\n\n return canExecuteFormat;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n if (primaryContributor.length == 0) {\n primaryContributor = \"Advertisement\";\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let isSecondaryTitle = true;\n\n let fakeRefData = new Object();\n fakeRefData.contributors = [];\n fakeRefData.title = refData.title;\n \n let primaryContributor = shared.getPrimaryContributorCitationString(fakeRefData, titleProperty, isSecondaryTitle);\n\n if (primaryContributor.length == 0) {\n primaryContributor = \"Advertisement\";\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let type = shared.getStringValue(refData.type);\n\n let title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.doubleQuote();\n }\n\n primaryPart = primaryPart.appendData(title, ', ');\n }\n else {\n let sponsor = shared.getStringValue(refData.sponsor);\n\n if (sponsor.length > 0) {\n primaryPart = primaryPart.appendData(sponsor, ', ', 'Advertisement for');\n }\n else {\n primaryPart = primaryPart.appendData('Advertisement', ', ');\n }\n\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let sponsor = shared.getStringValue(refData.sponsor);\n let title = shared.getStringValue(refData.title);\n\n if (sponsor.length > 0 && title.length > 0) {\n sponsor = sponsor.toTitleCase();\n sponsor = sponsor.italicize();\n\n container1 = container1.appendData(sponsor, ', ');\n }\n\n let publicationDate = shared.getFullDate(refData.publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n //location\n let location = shared.getStringValue(refData.location);\n container1 = container1.appendData(location, ', ', '', '');\n\n //url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n //format\n let format = shared.getStringValue(refData.format);\n\n if (format.length > 0) {\n secondSupplemental = secondSupplemental.appendData(format, ', ', '', '');\n\n if (type == 'digital') {\n secondSupplemental = secondSupplemental.appendData('advertisement', ' ');\n }\n }\n else {\n let sponsor = shared.getStringValue(refData.sponsor);\n let title = shared.getStringValue(refData.title);\n\n if (sponsor.length == 0 && title.length > 0) {\n secondSupplemental = secondSupplemental.appendData('Advertisement', ', ');\n }\n }\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.bookTitle);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.originalPublicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'bookTitle';\n let isSecondaryTitle = false;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\n\n let title = '';\n\n //TODO: see if there is any secondary title information used here\n // //title will not be used in this section if this is a book chapter\n // if (type == 'bookChapter') {\n // title = shared.getStringValue(refData.chapterTitle);\n \n // if (title.length > 0) {\n // title = title.toTitleCase();\n // title = title.doubleQuote();\n // }\n // }\n // else{\n title = shared.getStringValue(refData.bookTitle);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.italicize();\n }\n }\n // }\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n\t//translatedTitle\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (translatedTitle.length > 0) {\n translatedTitle = translatedTitle.replaceAmpersand();\n translatedTitle = translatedTitle.toTitleCase();\n translatedTitle = translatedTitle.italicize();\n\n primaryPart = primaryPart.appendData('[' + translatedTitle + ']', ' ', '', ''); \n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n\t//originalPublicationDate \n\tlet originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n originalPublicationDate = shared.getFullDate(originalPublicationDate);\n originalPublicationDate = shared.formatOriginalPublicationDate(originalPublicationDate);\n\tfirstSupplemental = firstSupplemental.appendData(originalPublicationDate, ', ');\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n // let type = shared.getStringValue(refData.type);\n // let kind = shared.getStringValue(refData.kind);\n\n\t//Secondary Contribs\n let secondaryContributor = shared.getSecondaryContributorString(refData.contributors);\n container1 = container1.appendData(secondaryContributor, ', ');\n\n\t//edition\n\tlet edition = shared.getStringValue(refData.edition);\n\tedition = shared.fixEditionString(edition);\n\tcontainer1 = container1.appendData(edition, ', ');\n \n\t//Publishers\n\tlet publisherString = shared.getPublisherString(refData.publishers);\n\tcontainer1 = container1.appendData(publisherString, ', ');\n\n\t//publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n\t// doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n } else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n \n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any container data needed\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n //TODO: add any supplemental data needed\n\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n\tlet primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n\t\tauthorPart: primaryContributor,\n\t\tauthorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n\t\tauthorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n if (refData.type == 'entry') {\n citationTitle = shared.getStringValue(refData.entryTitle);\n }\n else{\n citationTitle = shared.getStringValue(refData.anthologyTitle); \n }\n\n\tcitationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.originalPublicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n\tlet titleProperty = 'anthologyTitle';\n\tlet isSecondaryTitle = false;\n\n\tlet type = shared.getStringValue(refData.type);\t//anthology|entry\n\t\n\tif(type === 'entry'){\n\t\ttitleProperty = 'entryTitle';\n\t\tisSecondaryTitle = true;\n\t}\n\n\tlet citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle,);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\t//anthology\n\tlet kind = shared.getStringValue(refData.kind);\t//whole\n\n let title = '';\n\n\tif(type === 'anthology'){\n\t\ttitle = shared.getStringValue(refData.anthologyTitle);\n\t} else if(type === 'entry'){\n\t\ttitle = shared.getStringValue(refData.entryTitle);\n\t}\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t} else{\n\t\t\ttitle = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t\t\n\t\t\tif(type === 'anthology'){\n\t\t\t\ttitle = title.italicize();\n\t\t\t} else if(type === 'entry'){\n\t\t\t\ttitle = title.doubleQuote();\n\t\t\t}\n\t\t}\n\t}\n\n if (title.length > 0) {\n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n\tif(type === 'anthology'){\n\t\t//translatedAnthologyTitle\n\t\tlet translatedTitle = shared.getStringValue(refData.translatedAnthologyTitle);\n\n\t\tif (translatedTitle.length > 0) {\n\t\t\ttranslatedTitle = translatedTitle.replaceAmpersand();\n\t\t\ttranslatedTitle = translatedTitle.toTitleCase();\n\t\t\ttranslatedTitle = translatedTitle.italicize();\n\n\t\t\tprimaryPart = primaryPart.appendData('[' + translatedTitle + ']', ' ', '', ''); \n\t\t}\n\t} else if(type === 'entry'){\n\t\t//translatedEntryTitle\n\t\tlet translatedEntryTitle = shared.getStringValue(refData.translatedEntryTitle);\n\n\t\tif (translatedEntryTitle.length > 0) {\n\t\t\ttranslatedEntryTitle = translatedEntryTitle.replaceAmpersand();\n\t\t\ttranslatedEntryTitle = translatedEntryTitle.toTitleCase();\n\t\t\ttranslatedEntryTitle = translatedEntryTitle.doubleQuote();\n\n\t\t\tprimaryPart = primaryPart.appendData('[' + translatedEntryTitle + ']', ' ', '', ''); \n\t\t}\n\t}\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n\tif(type === 'anthology'){\n\t\t//originalPublicationDate\n\t\tlet originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n\t\toriginalPublicationDate = shared.getFullDate(originalPublicationDate);\n\t\tfirstSupplemental = firstSupplemental.appendData(originalPublicationDate, ', ');\n\t} else if(type === 'entry'){\n\t\t//originalPublicationDate\n\t\tlet originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n\t\toriginalPublicationDate = shared.getFullDate(originalPublicationDate);\n\t\tfirstSupplemental = firstSupplemental.appendData(originalPublicationDate, ', ');\n\t}\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n\t// Grab data, then assemble it differently based on type\n\n\t//Secondary Contributors\n\tlet secondaryContributor = shared.getSecondaryContributorString(refData.contributors);\n\n\t//edition\n\tlet edition = shared.getStringValue(refData.edition);\n\tedition = shared.fixEditionString(edition);\n\n\t//Publishers\n\tlet publisherString = shared.getPublisherString(refData.publishers);\n\n\t//publicationDate\n\tlet publicationDate = shared.getStringValue(refData.publicationDate);\n\tpublicationDate = shared.getFullDate(publicationDate);\n\n\t// doi/url\n\tlet url = shared.getStringValue(refData.url);\n\tlet doi = shared.getStringValue(refData.doi);\n\tlet urlDoiOutput = '';\n\n\tif (doi.length > 0) {\n\t\turlDoiOutput = shared.appendDOIURL(doi);\n\t} else {\n\t\tif (url.length > 0) {\n\t\t\turlDoiOutput = shared.formatURL(url);\n\t\t}\n\t}\n\n\n if(type === 'anthology'){\n\t\t//Secondary Contributors\n\t\tcontainer1 = container1.appendData(secondaryContributor, ', ');\n\n\t\t//edition\n\t\tcontainer1 = container1.appendData(edition, ', ');\n\n\t\t//publishers\n\t\tcontainer1 = container1.appendData(publisherString, ', ');\n\n\t\t//publicationDate\n\t\tcontainer1 = container1.appendData(publicationDate, ', ');\n\n\t\t// doi/url\n\t\tcontainer1 = container1.appendData(urlDoiOutput, ', ');\n\t\t\n\n\t} else if(type === 'entry'){\n\t\t//anthologyTitle\n\t\tlet anthologyTitle = '';\n\t\tanthologyTitle = shared.getStringValue(refData.anthologyTitle);\n\t\tif(anthologyTitle.length > 0){\n\t\t\tanthologyTitle = anthologyTitle.toTitleCase();\n\t\t\tanthologyTitle = anthologyTitle.italicize();\n\t\t\tcontainer1 = container1.appendData(anthologyTitle, ', ');\n\t\t}\n\t\t\n\t\t//translatedAnthologyTitle\n\t\tlet translatedAnthologyTitle = '';\n\t\ttranslatedAnthologyTitle = shared.getStringValue(refData.translatedAnthologyTitle);\n\t\tif(translatedAnthologyTitle.length > 0){\n\t\t\ttranslatedAnthologyTitle = translatedAnthologyTitle.toTitleCase();\n\t\t\ttranslatedAnthologyTitle = '[' + translatedAnthologyTitle.italicize() + ']';\n\t\t\tcontainer1 = container1.appendData(translatedAnthologyTitle, ' ');\n\t\t}\n\n\t\t//Secondary Contributors\n\t\tcontainer1 = container1.appendData(secondaryContributor, ', ');\n\n\t\t//edition\n\t\tcontainer1 = container1.appendData(edition, ', ');\n\n\t\t//publishers\n\t\tcontainer1 = container1.appendData(publisherString, ', ');\n\n\t\t//publicationDate\n\t\tcontainer1 = container1.appendData(publicationDate, ', ');\n\n\t\t//pageNumbers\n\t\tlet pageNumbers = shared.getStringValue(refData.pageNumbers);\n\t\tpageNumbers = shared.formatPageNumbers(pageNumbers);\n\t\tcontainer1 = container1.appendData(pageNumbers, ', ');\n\n\t\t// doi/url\n\t\tcontainer1 = container1.appendData(urlDoiOutput, ', ');\n\t}\n\n\t//do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any container data needed\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let title = '';\n\n //TODO: see if there is any secondary title information used here\n // //title will not be used in this section if this is a book chapter\n // if (type == 'bookChapter') {\n // title = shared.getStringValue(refData.chapterTitle);\n \n // if (title.length > 0) {\n // title = title.toTitleCase();\n // title = title.doubleQuote();\n // }\n // }\n // else{\n title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.italicize();\n }\n }\n // }\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n // Model\n\tlet model = shared.getStringValue(refData.model);\n\tcontainer1 = container1.appendData(model, ', ');\n\n\t//publicationDate\n\tlet publicationDate = shared.getStringValue(refData.publicationDate);\n\tpublicationDate = shared.getFullDate(publicationDate);\n\tcontainer1 = container1.appendData(publicationDate, ', ');\n\t\n\t// doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n } else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n\tlet type = shared.getStringValue(refData.type);\n\n\tlet secondSupplemental = '';\n\n\tif(type === 'apparatus') {\n\t\tsecondSupplemental = 'Apparatus.';\n\t} else {\n\t\tsecondSupplemental = 'Apparatus and software.';\n\t}\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let title = shared.getStringValue(refData.title);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t}\n\t\telse{\n title = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t\ttitle = title.italicize();\n\t\t}\n\t}\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\t\n\tlet type = shared.getStringValue(refData.type);\n\n\t//PublicationDate\n\tlet publicationDate = shared.getYear(refData.publicationDate);\n\tcontainer1 = container1.appendData(publicationDate, ', ');\n\n // container1 = container1.appendData(publicationDate, ', ');\n\n\t//publishers\n let publisherString = shared.getPublisherString(refData.publishers);\n container1 = container1.appendData(publisherString, ', ');\n\t\n\tif(type === 'museum'){\n\t\t//city \n\t\tlet city = shared.getStringValue(refData.city);\n\t\tcontainer1 = container1.appendData(city, ', ');\n\n\t\t//state \n\t\tlet state = shared.getStringValue(refData.state);\n\t\tcontainer1 = container1.appendData(state, ', ');\n\n\t\t//country \n\t\tlet country = shared.getStringValue(refData.country);\n\t\tcontainer1 = container1.appendData(country, ', ');\n\t}//e:if:museum\n\n\t// doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n } else {\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n\tlet title = shared.getStringValue(refData.title);\n\n\t// if(title.length > 0 && !title.startsWith('[')){\n\t\t//format (used if the title isn't blank and the description is used instead)\n\t\tlet format = shared.getStringValue(refData.format);\n\t\tsecondSupplemental = secondSupplemental.appendData(format, ', ');\n\t// }\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0 || kind.length == 0) {\n return 'Type and Kind required.';\n }\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\n\nfunction getCitationTitle(refData){\n\n let citationTitle = 'United States';\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n let type = shared.getStringValue(refData.type);\n let primaryContributor = 'United States';\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n switch (kind) {\n case 'house':\n case 'houseJoint':\n primaryPart = 'United States, Congress, House';\n break;\n case 'senate':\n case 'senateJoint':\n primaryPart = 'United States, Congress, Senate';\n break;\n case '':\n primaryPart = 'United States, Congress';\n break;\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n\n let title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n // title = title.italicize();\n }\n\n primaryPart = primaryPart.appendData(title, ' ');\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type == 'enactedFed') {\n let volume = shared.getStringValue(refData.volume);\n let pageNumber = shared.getStringValue(refData.pageNumber);\n\n if (volume.length > 0 || pageNumber.length > 0) {\n container1 = container1.appendData('Congressional Record', ', ');\n \n //volume\n container1 = container1.appendData(volume, ' ', '', '');\n\n //pageNumber\n pageNumber = shared.formatPageNumbers(pageNumber);\n container1 = container1.appendData(pageNumber, ', ');\n }\n }\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let session = shared.getStringValue(refData.session);\n\n if (session.length > 0) {\n session = shared.getOrdinalValue(session);\n container2 = container2.appendData(session, ', ', '', 'Congress');\n }\n\n let label = '';\n\n switch (kind) {\n case 'senate':\n container2 = container2.appendData('Senate Resolution', ', ');\n break;\n case 'house':\n container2 = container2.appendData('House Resolution', ', ');\n break;\n case 'senateJoint':\n container2 = container2.appendData('Senate Joint Resolution', ', ');\n break;\n case 'houseJoint':\n container2 = container2.appendData('House Joint Resolution', ', ');\n break;\n }\n\n let billNumber = shared.getStringValue(refData.billNumber);\n container2 = container2.appendData(billNumber, ' ', '', '');\n\n //publicationDate\n let pubDateLabel = 'passed';\n\n if (type == 'unenactedFed') {\n pubDateLabel = 'considered'\n }\n\n let publicationDate = shared.getFullDate(refData.publicationDate);\n container2 = container2.appendData(publicationDate, ', ', pubDateLabel);\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n\tlet primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n\t\tauthorPart: primaryContributor,\n\t\tauthorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n\t\tauthorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.entryTitle);\n\tcitationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n\tlet primaryContributor;\n\n //define our citation logic for this type here\n\tlet isGroupAuthorMatchBlogTitle = getGroupAuthorMatchBlogTitle(refData);\n\t\n let titleProperty = 'entryTitle';\n let isSecondaryTitle = true;\n\n\tif(isGroupAuthorMatchBlogTitle){\n\t\t//make a copy of refdata to pass off to the shared code\n\t\tlet fakeRefData = new Object();\n\n\t\tif (refData.type == 'entry') {\n\t\t\tfakeRefData.entryTitle = refData.entryTitle;\t\t\t\n\t\t}\n\t\telse{\n\t\t\tfakeRefData.entryTitle = refData.blogTitle;\n\t\t\tisSecondaryTitle = false;\n\t\t}\n\n\t\tfakeRefData.contributors = []; //contribs arent listed in the citation here\n\t\tprimaryContributor = shared.getPrimaryContributorCitationString(fakeRefData, titleProperty, isSecondaryTitle);\n\t} else {\n\t\tprimaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n\t}\n\n\tlet citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\n\n\nfunction getPrimaryInformation(refData){\n\tlet primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n\tlet isGroupAuthorMatchBlogTitle = getGroupAuthorMatchBlogTitle(refData);\n\n\tlet title = shared.getStringValue(refData.entryTitle);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t}\n\t\telse{\n\t\t\ttitle = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t\ttitle = title.doubleQuote();\n\t\t}\n\t}\n\n\tif(isGroupAuthorMatchBlogTitle){\n\t\tlet entryTitle = shared.getStringValue(refData.entryTitle);\n\t\tif (entryTitle.length > 0) {\n\t\t\tentryTitle = entryTitle.replaceAmpersand();\n\t\t\tentryTitle = entryTitle.toTitleCase();\n\t\t\tentryTitle = entryTitle.doubleQuote();\n\t\t\tprimaryPart = entryTitle;\n\t\t}\n\t} else {\n\t\tprimaryPart = primaryContributor;\n\t\t\n\t\tif (title.length > 0) {\n\t\t\tif (primaryPart.length > 0) {\n\t\t\t\tprimaryPart = primaryPart + ' ' + title;\n\t\t\t} else{\n\t\t\t\tprimaryPart = title;\n\t\t\t}\n\t\t}\n\t}\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n // blogTitle\n\tlet blogTitle = shared.getStringValue(refData.blogTitle);\n\n\tif (blogTitle.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (blogTitle.startsWith('[')) {\n\t\t\tblogTitle = shared.removeDescriptionFromTitle(blogTitle);\n\t\t} else{\n\t\t\tblogTitle = blogTitle.replaceAmpersand();\n\t\t\tblogTitle = blogTitle.toTitleCase();\n\t\t\tblogTitle = blogTitle.italicize();\n\t\t}\n\t\tcontainer1 = container1.appendData(blogTitle, ', ');\n\t}\n\n\t// publicationDate\n\tlet publicationDate = shared.getStringValue(refData.publicationDate);\n\tpublicationDate = shared.getFullDate(publicationDate);\n\tcontainer1 = container1.appendData(publicationDate, ', ');\n\n\t//url\n\tlet url = shared.getStringValue(refData.url);\n\tif (url.length > 0) {\n\t\turl = shared.formatURL(url);\n\t\tcontainer1 = container1.appendData(url, ', ');\n\t}\n\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n \n\t// retrievalDate\n\tlet retrievalDate = shared.getStringValue(refData.retrievalDate);\n\tretrievalDate = shared.getFullDate(retrievalDate);\n\tsecondSupplemental = secondSupplemental.appendData(retrievalDate, ', ', 'Accessed');\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n\tif (refData.type == 'blog') {\n\t\tsecondSupplemental = secondSupplemental.appendData('Blog series.');\n\t}\n\n return secondSupplemental;\n}\n\n\n// reference and citation output is different if the group author and the blog title are the same\nfunction getGroupAuthorMatchBlogTitle(refData){\n\tlet primaryContributor = shared.getPrimaryContributorString(refData);\n\t\n\tlet primaryContributorMinusLastCharacter = '';\n\t\n\tlet blogTitle = '';\n\n\t// remove the last character (period)\n\tif(primaryContributor.length > 0){\n\t\tprimaryContributorMinusLastCharacter = primaryContributor.substring(0, primaryContributor.length - 1);\n\t\t\n\t\t//blogTitle (to compare with primaryContributorMinusLastCharacter)\n\t\tblogTitle = shared.getStringValue(refData.blogTitle);\n\n\t\tif (blogTitle.length > 0) {\n\t\t\tif(primaryContributorMinusLastCharacter === blogTitle){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn false;\n\n}","/*\n*****Book*****\n \nPrimary Information\n\n First Supplemental\n\nContainer 1\n\nContainer 2\n\n Second Supplemental\n\n\n\nAuthora, Albert Alfred, et al. My Search for Sasquatch. \n\nEdited by Albert Alfred Editora et al., translated by Albert Alfred Translatora et al., illustrated by Albert Alfred Illustratora et al., narrated by Albert Alfred Narratora et al., Critical Edition, e-book ed., vol. 1, Crypto Press / Bigfoot Times / Nessie & Co., 2018, https://doi.org/10.1109/5.771073.\n\n*****CITATION INFO*****\n\nPage = no abbreviation with citation\nParagraph = para. // paras.\nSection = sec. // secs.\nTable = tab. // tabs.\nFigure = fig. // figs.\n\nUse n-dash (option + -) to separate spans with no spaces on either side.\n\n*/\n\nconst shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0 || kind.length == 0) {\n return 'Type and Kind required.';\n }\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n if (refData.type == 'bookChapter') {\n citationTitle = shared.getStringValue(refData.chapterTitle);\n }\n else{\n citationTitle = shared.getStringValue(refData.bookTitle); \n }\n\n return citationTitle.replaceAmpersand();\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n\n let titleProperty = 'bookTitle';\n let isSecondaryTitle = false;\n\n let type = shared.getStringValue(refData.type);\n\n if (type == 'bookChapter') {\n titleProperty = 'chapterTitle';\n isSecondaryTitle = true;\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\n\n let title = '';\n\n //title will not be used in this section if this is a book chapter\n if (type == 'bookChapter') {\n title = shared.getStringValue(refData.chapterTitle);\n \n if (title.length > 0) {\n title = title.toTitleCase();\n title = title.doubleQuote();\n }\n }\n else{\n title = shared.getStringValue(refData.bookTitle);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.toTitleCase();\n title = title.italicize();\n }\n }\n }\n\n if (title.length > 0) {\n\n title = title.replaceAmpersand();\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n //check translated title based off chapter or book\n if (type == 'bookChapter') {\n //Translated Chapter Title\n let translatedChapterTitle = shared.getStringValue(refData.translatedChapterTitle);\n\n if (translatedChapterTitle.length > 0) {\n translatedChapterTitle = translatedChapterTitle.replaceAmpersand();\n translatedChapterTitle = translatedChapterTitle.toTitleCase();\n translatedChapterTitle = translatedChapterTitle.doubleQuote();\n\n primaryPart = primaryPart.appendData('[' + translatedChapterTitle + ']', ' ', '', ''); \n }\n }\n else{\n //Translated Title\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n \n if (translatedTitle.length > 0) {\n translatedTitle = translatedTitle.replaceAmpersand();\n translatedTitle = translatedTitle.toTitleCase();\n translatedTitle = translatedTitle.italicize();\n\n primaryPart = primaryPart.appendData('[' + translatedTitle + ']', ' ', '', ''); \n }\n }\n\n // primaryPart = shared.fixClosure(primaryPart);\n primaryPart = primaryPart.addClosure();\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (kind != 'book' && kind != 'journal') {\n let originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n firstSupplemental = firstSupplemental.appendData(originalPublicationDate, ''); \n }\n\n if (type == 'bookChapter') {\n //Add ChapterTranslators, but only of chapter translators are not the primary contributor already and have been used as such\n\n if (typeof refData.contributors === 'undefined') {\n return contributorstring;\n }\n\n if (refData.contributors.length > 0) {\n let primaryType = shared.getStringValue(refData.contributors[0].type);\n\n if (primaryType != 'chapterTranslator') {\n //chapterTranslator\n let supplementalContributors = shared.getFirstSupplementalContributorString(refData, 'chapterTranslator');\n firstSupplemental = firstSupplemental.appendData(supplementalContributors, ', ');\n } \n }\n }\n \n let volumeClosure = false;\n\n if ((kind == 'multivolume' && type == 'book') || type == 'series') {\n //Volume Title\n let volumeTitle = shared.getStringValue(refData.volumeTitle);\n\n if (volumeTitle.length > 0) { \n volumeTitle = volumeTitle.replaceAmpersand();\n volumeTitle = volumeTitle.toTitleCase();\n volumeTitle = volumeTitle.italicize();\n\n firstSupplemental = firstSupplemental.appendData(volumeTitle, '');\n }\n else{\n //put series title here if we have one, and not the volume\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n\n if (seriesTitle.length > 0) {\n seriesTitle = seriesTitle.replaceAmpersand();\n seriesTitle = seriesTitle.toTitleCase();\n seriesTitle = seriesTitle.italicize();\n\n firstSupplemental = firstSupplemental.appendData(seriesTitle, '');\n\n let volume = shared.getStringValue(refData.volume);\n \n if (volume.length > 0) {\n\n if (refData.type != 'series') {\n firstSupplemental = firstSupplemental.appendData(volume, '. ', 'Vol.');\n }\n\n if (type == 'series') {\n firstSupplemental = firstSupplemental + '.';\n }\n else{\n firstSupplemental = firstSupplemental + ',';\n }\n\n volumeClosure = true;\n }\n }\n }\n }\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n\n if (!volumeClosure) {\n firstSupplemental = shared.fixClosure(firstSupplemental);\n }\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n //if bookChapter, then title will be used in this container\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type == 'bookChapter') {\n title = shared.getStringValue(refData.bookTitle);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.italicize();\n }\n\n container1 = container1.appendData(title, '');\n }\n\n //translatedTitle\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (translatedTitle.length > 0) {\n translatedTitle = translatedTitle.replaceAmpersand();\n translatedTitle = translatedTitle.toTitleCase();\n translatedTitle = translatedTitle.italicize();\n\n container1 = container1.appendData('[' + translatedTitle + ']', ' ', '', ''); \n }\n\n if (kind == 'multivolume') {\n let volumeTitle = shared.getStringValue(refData.volumeTitle);\n\n if (volumeTitle.length > 0) {\n volumeTitle = volumeTitle.replaceAmpersand();\n volumeTitle = volumeTitle.toTitleCase();\n volumeTitle = volumeTitle.italicize();\n\n container1 = container1.appendData(volumeTitle, '');\n }\n }\n }\n\n //Secondary Contribs\n let secondaryContributor = '';\n\n if (type == 'series' && kind == 'volume') {\n //we need to pull volume editors specifically for this one\n let volumeEditors = shared.getContributorsByType('volumeEditor', refData.contributors);\n secondaryContributor = shared.getSecondaryContributorTypeString(volumeEditors,'volumeEditor');\n }\n else{\n secondaryContributor = shared.getSecondaryContributorString(refData.contributors);\n }\n\n container1 = container1.appendData(secondaryContributor, ', ');\n \n //edition\n let edition = shared.getStringValue(refData.edition);\n edition = shared.fixEditionString(edition);\n container1 = container1.appendData(edition, ', ');\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n\n //lowercase first letter of format if the container already has data\n if (container1.length > 0 && format.length > 0) {\n format = format.charAt(0).toLowerCase() + format.slice(1)\n }\n\n container1 = container1.appendData(format, ', ', '', '');\n\n //do not add volume here if there is a series title...it will go in second supplemenmtal\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n\n if (seriesTitle.length == 0 && kind != 'journal') {\n //volume\n let volume = shared.getStringValue(refData.volume);\n container1 = container1.appendData(volume, ', ', 'vol.', ''); \n }\n \n //Publishers\n let publisherString = shared.getPublisherString(refData.publishers);\n container1 = container1.appendData(publisherString, ', ');\n\n //pub date\n //journals will use this in supplemental\n if (kind != 'journal') {\n let year = shared.getYear(refData.publicationDate);\n container1 = container1.appendData(year, ', '); \n }\n \n //referencePages\n let referencePages = shared.getStringValue(refData.referencePages);\n referencePages = shared.formatPageNumbers(referencePages);\n container1 = container1.appendData(referencePages, ', ');\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n if (refData.type == 'series' && refData.kind == 'series') {\n let volume = shared.getStringValue(refData.volume);\n\n if (volume.length > 0) {\n container1 = container1.appendData(volume, '. ', '', 'vols.');\n }\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n //for translated titles, original publication is moved from first to second supplemental\n if (type == 'bookChapter') {\n let title = '';\n let prefix = 'Originally published in ';\n \n if (kind == 'journal') {\n prefix = 'Originally published as ';\n //articleTitle\n let articleTitle = shared.getStringValue(refData.articleTitle);\n\n if (articleTitle.length > 0) {\n articleTitle = articleTitle.replaceAmpersand();\n articleTitle = articleTitle.toTitleCase();\n articleTitle = articleTitle.doubleQuote();\n title = title.appendData(articleTitle, ', ');\n }\n\n //journalTitle\n let journalTitle = shared.getStringValue(refData.journalTitle);\n\n if (journalTitle.length > 0) {\n journalTitle = journalTitle.replaceAmpersand();\n journalTitle = journalTitle.toTitleCase();\n journalTitle = journalTitle.italicize();\n title = title.appendData(journalTitle, ', ');\n }\n\n //volume\n let volume = shared.getStringValue(refData.volume);\n title = title.appendData(volume, ', ', 'vol.', ''); \n\n //issue\n let issue = shared.getStringValue(refData.issue);\n title = title.appendData(issue, ', ', 'no.', ''); \n }\n else{\n let originalBookTitle = shared.getStringValue(refData.originalBookTitle);\n\n if (originalBookTitle.length > 0) {\n title = title.replaceAmpersand();\n title = originalBookTitle.toTitleCase();\n title = title.italicize();\n }\n }\n\n let originalEditors = shared.getContributorsByType('originalEditor', refData.contributors);\n let originalEditorString = '';\n\n if (originalEditors.length > 0) {\n originalEditorString = shared.getSecondaryContributorTypeString(originalEditors, 'originalEditor')\n }\n\n let originalPublisherString = shared.getPublisherString(refData.publishers, 'original');\n\n let originalPublicationDate = shared.getYear(refData.originalPublicationDate);\n \n let originalPages = shared.getStringValue(refData.originalPages);\n\n if (originalPages.length > 0) {\n originalPages = shared.formatPageNumbers(originalPages);\n }\n\n let originalDoi = shared.getStringValue(refData.originalDoi);\n let originalUrl = shared.getStringValue(refData.originalUrl);\n\n if (originalDoi.length > 0) {\n originalUrl = shared.appendDOIURL(originalDoi);\n }\n else{\n if (originalUrl.length > 0) {\n originalUrl = shared.formatURL(originalUrl);\n }\n }\n\n if (title.length > 0 ||\n originalEditorString.length > 0 ||\n originalPublisherString.length > 0 ||\n originalUrl.length > 0 ||\n originalPages.length > 0) {\n \n secondSupplemental = secondSupplemental.appendData(title, '');\n secondSupplemental = secondSupplemental.appendData(originalEditorString, ', ');\n secondSupplemental = secondSupplemental.appendData(originalPublisherString, ', ');\n secondSupplemental = secondSupplemental.appendData(originalPublicationDate, ', ');\n secondSupplemental = secondSupplemental.appendData(originalPages, ', ');\n secondSupplemental = secondSupplemental.appendData(originalUrl, ', ');\n\n secondSupplemental = prefix + secondSupplemental;\n }\n }\n\n //seriesTitle\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n let volumeTitle = shared.getStringValue(refData.volumeTitle);\n \n if (seriesTitle.length > 0 && volumeTitle.length > 0) {\n let volume = shared.getStringValue(refData.volume);\n \n if (volume.length > 0) {\n secondSupplemental = secondSupplemental.appendData(volume, '', 'Vol.', 'of');\n }\n\n seriesTitle = seriesTitle.replaceAmpersand();\n seriesTitle = seriesTitle.toTitleCase();\n seriesTitle = seriesTitle.italicize();\n\n secondSupplemental = secondSupplemental.appendData(seriesTitle, ' ', '', '');\n }\n\n if (type == 'series' && kind == 'volume') {\n let seriesEditors = shared.getContributorsByType('editor', refData.contributors);\n let seriesEditorString = shared.getSecondaryContributorTypeString(seriesEditors,'seriesEditor');\n\n if (seriesEditorString.length > 0) {\n\n if (seriesEditors.length == 1) {\n seriesEditorString = seriesEditorString + ', series editor';\n }\n else{\n seriesEditorString = seriesEditorString + ', series editors';\n }\n\n secondSupplemental = secondSupplemental.appendData(seriesEditorString, ', ', '', '');\n }\n }\n\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\n\n let title = shared.getStringValue(refData.title);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t}\n\t\telse{\n title = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t\ttitle = title.italicize();\n\t\t}\n\t}\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n\n\t//translatedTitle\n\tlet translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n\tif (translatedTitle.length > 0) {\n translatedTitle = translatedTitle.replaceAmpersand();\n\t\ttranslatedTitle = translatedTitle.toTitleCase();\n\t\ttranslatedTitle = translatedTitle.italicize();\n\n\t\tprimaryPart = primaryPart.appendData('[' + translatedTitle + ']', ' ', '', ''); \n\t}\n\n\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n\t//Secondary Contribs\n\tlet secondaryContributor = shared.getSecondaryContributorString(refData.contributors);\n\tcontainer1 = container1.appendData(secondaryContributor, ', ');\n\n\t//publishers\n let publisherString = shared.getPublisherString(refData.publishers);\n container1 = container1.appendData(publisherString, ', ');\n\n\t//publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n\t// doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n } else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any container data needed\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let type = shared.getStringValue(refData.type);\n\n let secondSupplemental = '';\n \n //if the title is a description, then we don't put this label in\n let title = shared.getStringValue(refData.title);\n\n if (!title.startsWith('[')) {\n if(type === 'brochure') {\n secondSupplemental = 'Brochure.';\n } else if(type === 'pamphlet') {\n secondSupplemental = 'Pamphlet.';\n }\n }\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n // use title or description if title is empty\n\tlet title = shared.getStringValue(refData.title);\n\n if (title.length == 0) {\n citationTitle = shared.getStringValue(refData.description);\n }\n else{\n citationTitle = title; \n }\n\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n\tlet isSecondaryTitle = false;\n\n let primaryContributor;\n\tlet titleProperty;\n\n\t// use title or description if title is empty\n\tlet title = shared.getStringValue(refData.title);\n\n\tif (title.length > 0) {\n\t\ttitleProperty = 'title';\n\t} else {\n\t\ttitleProperty = 'description';\n\t}\n\t\n\tif(refData.contributors.length === 0){\n\t\t// no contributors exisit\n\t\tif (title.length === 0) {\n\t\t\tprimaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle, true);\n\t\t} else {\n\t\t\tprimaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n\t\t}\n\t\t\n\t} else {\n\t\t// contributors exisit\n\t\tprimaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle, true);\n\t}\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let title = shared.getStringValue(refData.title);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t} else{\n title = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t\ttitle = title.italicize();\n\t\t}\n\t}\n\n if (title.length > 0) {\n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n } else {\n\t\t// since there is not a title, only a description, the description becomes the title in Primary Info\n\t\t//description\n\t\tdescription = shared.getStringValue(refData.description);\n\t\tif (description.length > 0) {\n\t\t\tprimaryPart = primaryPart.appendData(description, ' ');\n\t\t}\n\t}\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n //Publishers\n let publisherString = shared.getPublisherString(refData.publishers);\n container1 = container1.appendData(publisherString, ', ');\n\n\t//publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n\t//url\n\tlet url = shared.getStringValue(refData.url);\n\tif (url.length > 0) {\n\t\turl = shared.formatURL(url);\n\t\tcontainer1 = container1.appendData(url, ', ');\n\t}\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n\tcontainer2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\t\n\t//retrievalDate\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n retrievalDate = shared.getFullDate(retrievalDate);\n secondSupplemental = secondSupplemental.appendData(retrievalDate, ', ', 'accessed', '');\n\n\tlet title = shared.getStringValue(refData.title);\n\n\t//description\n\tif(title.length > 0){\n\tlet description = shared.getStringValue(refData.description);\n\tif (description.length > 0) {\n\t\tdescription = description.toLowerCase();\n\t\tsecondSupplemental = secondSupplemental.appendData(description, ', ');\n\t}\n\t}\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n let authors = shared.getContributorsByType('author', refData.contributors);\n let fakeRefData = new Object();\n fakeRefData.contributors = authors;\n fakeRefData.title = refData.title;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(fakeRefData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n //for this type, only authors are primary, so filter those out\n let authors = shared.getContributorsByType('author', refData.contributors);\n let fakeRefData = new Object();\n fakeRefData.contributors = authors;\n\n let primaryContributor = shared.getPrimaryContributorString(fakeRefData);\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\n\n let title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.doubleQuote();\n }\n }\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n switch (type) {\n case 'conference':\n\n let conference = shared.getStringValue(refData.conference);\n container1 = container1.appendData(conference, ', ');\n\n let formattedDate = getConferenceDateRange(refData);\n container1 = container1.appendData(formattedDate, ', ');\n\n //location\n let location = getLocation(refData);\n container1 = container1.appendData(location, ', ');\n\n //url/doi\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n \n break;\n case 'symposium':\n let symposiumTitle = shared.getStringValue(refData.symposiumTitle);\n\n if (symposiumTitle.length > 0) {\n symposiumTitle = symposiumTitle.replaceAmpersand();\n symposiumTitle = symposiumTitle.toTitleCase();\n container1 = container1.appendData(symposiumTitle, ', ');\n }\n\n //Chairs\n let secondaryContributor = getSecondaryContributorString(refData.contributors);\n container1 = container1.appendData(secondaryContributor, ', ');\n\n break;\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type == 'symposium') {\n let conference = shared.getStringValue(refData.conference);\n container2 = container2.appendData(conference, ', ');\n\n let formattedDate = getConferenceDateRange(refData);\n container2 = container2.appendData(formattedDate, ', ');\n\n //location\n let location = getLocation(refData);\n container2 = container2.appendData(location, ', ');\n\n //url/doi\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container2 = container2.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container2 = container2.appendData(url, ', ');\n }\n }\n }\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n if (type == 'conference') {\n let description = shared.getStringValue(refData.description);\n secondSupplemental = secondSupplemental.appendData(description, ', ');\n }\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}\n\n//doing this as a one off since this is where all contributors go for this type\nfunction getSecondaryContributorString(contributors){\n\n let contributorstring = '';\n\n if (typeof contributors === 'undefined') {\n return contributorstring;\n }\n\n if (contributors.length > 0) {\n //for these contributors, get them all - authors (which includes group authors and user names)\n let secondaryContributors = contributors; \n \n if (secondaryContributors.length > 0) {\n\n let typeStrings = [];\n\n let authors = shared.getContributorsByType('chair', secondaryContributors);\n\n if (authors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(authors, 'chair'));\n }\n\n typeStrings.forEach(typeString => {\n if (contributorstring.length > 0) {\n contributorstring = contributorstring + \", \"\n }\n\n contributorstring = contributorstring + typeString;\n });\n }\n\n }\n\n return contributorstring;\n}\n\nfunction getConferenceDateRange(refData){\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let endDate = shared.getStringValue(refData.endDate);\n let formattedDate = '';\n\n if (endDate.length > 0) {\n formattedDate = shared.getFullDateRange(publicationDate, endDate);\n }\n else{\n formattedDate = shared.getFullDate(publicationDate);\n }\n\n return formattedDate;\n}\n\nfunction getLocation(refData){\n let city = shared.getStringValue(refData.city);\n let state = shared.getStringValue(refData.state);\n let country = shared.getStringValue(refData.country);\n\n //If city and state, don't include country. If no State, include Country. If no city, state and country. Always include 2 if we have it.\n let location = '';\n let counter = 0;\n\n if (city.length > 0) {\n location = city;\n counter++;\n }\n\n if (state.length > 0) {\n \n if (counter == 0) {\n location = state;\n }\n else{\n location = location + ', ' + state;\n }\n\n counter++;\n }\n\n if (counter < 2) {\n if (country.length > 0) {\n \n if (counter == 0) {\n location = country;\n }\n else{\n location = location + ', ' + country;\n }\n\n counter++;\n }\n }\n\n return location;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n if (refData.type == 'charter') {\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n }\n else{\n citationTitle = \"The Constitution\"; \n }\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n let type = shared.getStringValue(refData.type);\n let primaryContributor = 'The Constitution';\n\n if (type == 'charter') {\n let title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n title = title.italicize();\n primaryContributor = title;\n }\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n let type = shared.getStringValue(refData.type);\n\n switch (type) {\n case 'us':\n primaryPart = 'The Constitution of the United States';\n break;\n case 'state':\n\n let state = shared.getStringValue(refData.state);\n\n primaryPart = 'The Constitution';\n\n if (state.length > 0) {\n\n //TODO: de-abbreviate\n state = stateAbbreviationToFull(state);\n primaryPart = primaryPart.appendData(state, ' ', 'of');\n }\n\n primaryPart = primaryPart + ''\n\n break;\n case 'charter':\n \n let title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n title = title.replaceAmpersand();\n title = title.italicize();\n primaryPart = primaryPart.appendData(title, ' ');\n }\n\n break;\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type == 'charter') {\n let charterArticle = shared.getStringValue(refData.charterArticle);\n container1 = container1.appendData(charterArticle, ', ', 'Art.', );\n\n let paragraph = shared.getStringValue(refData.paragraph);\n\n var label = 'par.';\n\n if (shared.usePluralLabel(paragraph)) {\n label = 'pars.'\n }\n\n container1 = container1.appendData(paragraph, ', ', label, );\n }\n else{\n switch (kind) {\n case 'article':\n \n let article = shared.getStringValue(refData.article);\n container1 = container1.appendData(article, ', ', 'Art.', );\n\n let section = shared.getStringValue(refData.section);\n container1 = container1.appendData(section, ', ', 'Sec.', );\n\n break;\n case 'amendment':\n case 'repealed':\n\n let amendment = shared.getStringValue(refData.amendment);\n container1 = container1.appendData(amendment, ', ', 'Amend.', );\n \n break;\n }\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any container data needed\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n if (kind == 'repealed') {\n let repealDate = shared.getStringValue(refData.repealDate);\n repealDate = shared.getFullDate(repealDate);\n secondSupplemental = secondSupplemental.appendData(repealDate, ' ', 'Repealed');\n }\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}\n\n//https://www.law.cornell.edu/citation/4-500\nfunction stateAbbreviationToFull(abbreviation){\n //APA is entered in abbreviations...if they entered and abbreviation...convert it\n\n let word = '';\n\n var conversions = [\n ['Ala.', 'Alabama'],\n ['Ariz.', 'Arizona'],\n ['Ark.', 'Arkansas'],\n ['Cal.', 'California'],\n ['Colo.', 'Colorado'],\n ['Conn.', 'Connecticut'],\n ['Del.', 'Delaware'],\n ['D.C.', 'District of Columbia'],\n ['Fla.', 'Florida'],\n ['Ga.', 'Georgia'],\n ['Haw.', 'Hawaii'],\n ['Ill.', 'Illinois'],\n ['Ind.', 'Indiana'],\n ['Kan.', 'Kansas'],\n ['Ky.', 'Kentucky'],\n ['La.', 'Louisiana'],\n ['Me.', 'Maine'],\n ['Md.', 'Maryland'],\n ['Mass.', 'Massachusetts'],\n ['Mich.', 'Michigan'],\n ['Minn.', 'Minnesota'],\n ['Miss.', 'Mississippi'],\n ['Mo.', 'Missouri'],\n ['Mont.', 'Montana'],\n ['Neb.', 'Nebraska'],\n ['Nev.', 'Nevada'],\n ['N.H.', 'New Hampshire'],\n ['N.J.', 'New Jersey'],\n ['N.M.', 'New Mexico'],\n ['N.Y.', 'New York'],\n ['N.C.', 'North Carolina'],\n ['N.D.', 'North Dakota'],\n ['Okla.', 'Oklahoma'],\n ['Or.', 'Oregon'],\n ['Pa.', 'Pennsylvania'],\n ['R.I.', 'Rhode Island'],\n ['S.C.', 'South Carolina'],\n ['S.D.', 'South Dakota'],\n ['Tenn.', 'Tennessee'],\n ['Tex.', 'Texas'],\n ['Vt.', 'Vermont'],\n ['Va.', 'Virginia'],\n ['Wash.', 'Washington'],\n ['W. Va.', 'West Virginia'],\n ['Wis.', 'Wisconsin'],\n ['Wyo.', 'Wyoming']\n ];\n\n for (let index = 0; index < conversions.length; index++) {\n let thisConversion = conversions[index][0];\n\n if (thisConversion.toLowerCase() == abbreviation.toLowerCase()) {\n word = conversions[index][1];\n }\n } \n\n if (word == '') {\n //if we havent converted yet, just leave it as is\n word = abbreviation;\n }\n\n return word;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let title = shared.getStringValue(refData.title);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t}\n\t\telse{\n title = title.replaceAmpersand(); \n\t\t\ttitle = title.toTitleCase();\n\t\t\ttitle = title.italicize();\n\t\t}\n\t}\n\n if (title.length > 0) {\n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n\t// Version\n let version = shared.getStringValue(refData.version);\t\n\tcontainer1 = container1.appendData(version, ', ');\n\n\t//Publishers\n let publisherString = shared.getPublisherString(refData.publishers);\n container1 = container1.appendData(publisherString, ', ');\n\n\t// publicationDate\n\tlet publicationDate = shared.getStringValue(refData.publicationDate);\n\tpublicationDate = shared.getFullDate(publicationDate);\n\tcontainer1 = container1.appendData(publicationDate, ', ');\n\t\n\t// doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n } else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n\tlet type = shared.getStringValue(refData.type);\n\n\tif(type === 'published') {\n\t\tsecondSupplemental = 'Data set.';\n\t} else if(type === 'raw') {\n\t\t// secondSupplemental = 'Unpublished raw data';\n\t\t\n\t\t//retrievalDate\n\t\tlet retrievalDate = shared.getStringValue(refData.retrievalDate);\n\t\tretrievalDate = shared.getFullDate(retrievalDate);\n\t\tsecondSupplemental = secondSupplemental.appendData(retrievalDate, ', ', 'accessed');\n\t\tsecondSupplemental = secondSupplemental.appendData('unpublished raw data', ', ');\n\t\t\n\t}\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n\tlet secondSupplemental = getSecondSupplemental(refData);\t// 2ndSup goes inbetween containers here\n let containerTwo = getContainerTwo(refData);\n \n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n\t// 2ndSup goes inbetween containers here\n\tif (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n let primaryContributor = shared.getPrimaryContributorString(refData);\n primaryPart = primaryContributor;\n\n let title = shared.getStringValue(refData.title);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t} else{\n title = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t\ttitle = title.italicize();\n\t\t}\n\t}\n\n if (title.length > 0) {\n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = '';\n\t\n\t//publicationDate\n\tlet publicationDate = shared.getStringValue(refData.publicationDate);\n\tpublicationDate = shared.getFullDate(publicationDate);\n\tcontainer1 = container1.appendData(publicationDate, ', ');\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\n// 2ndSup goes inbetween containers here\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\t\n\tlet kind = shared.getStringValue(refData.kind);\n\n // institution\n\tlet institution = shared.getStringValue(refData.institution);\n\tsecondSupplemental = secondSupplemental.appendData(institution, ', ');\n\n\t// extra suffix\n\tlet extraSuffix = '';\n\tif(kind === 'doctorate'){\n\t\textraSuffix = \"doctoral dissertation\";\n\t} else if(kind === 'masters'){\n\t\textraSuffix = \"master's thesis\";\n\t}\n\tsecondSupplemental = secondSupplemental.appendData(extraSuffix, ', ');\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n //database\n\tlet database = shared.getStringValue(refData.database);\n\tif (database.length > 0) {\n\t\tdatabase = database.italicize();\n\t\tcontainer2 = container2.appendData(database, ', ');\n\t}\n\n //url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url);\n container2 = container2.appendData(url, ', ');\n }\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n","module.exports = {\n getReference,\n getCitation\n }\n \n function getReference(type, refData){\n var typeEngine = getTypeEngine(type);\n var reference = typeEngine.getReference(refData);\n \n return reference;\n }\n \n function getCitation(type, refData, citationData, paperRefs){\n var typeEngine = getTypeEngine(type);\n var citation = typeEngine.getCitation(refData, citationData, paperRefs);\n \n //add the brackets around the citation\n if (citation.first.length > 0) {\n citation.first = \"(\" + citation.first + \")\"; \n }\n \n if (citation.subsequent.length > 0) {\n citation.subsequent = \"(\" + citation.subsequent + \")\"; \n }\n \n return citation;\n }\n \n function getTypeEngine(type){\n var typeEngine = null;\n \n typeEngine = require('./MLA9-' + type +'.js');\n \n return typeEngine;\n }","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = 'United States';\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n let type = shared.getStringValue(refData.type);\n let primaryContributor = 'United States';\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n primaryPart = 'United States, Executive Office of the President';\n\n //there can only be one contrib\n if (typeof refData.contributors != 'undefined') {\n if (refData.contributors.length > 0) {\n let author = shared.getSecondaryReferenceName(refData.contributors[0]);\n\n if (author.length > 0) {\n author = '[' + author + ']';\n primaryPart = primaryPart.appendData(author, ' ');\n }\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n\n let orderNumber = shared.getStringValue(refData.orderNumber);\n let title = shared.getStringValue(refData.title);\n\n primaryPart = primaryPart.appendData(orderNumber, ' ', 'Executive order');\n\n if (title.length > 0) {\n if (orderNumber.length > 0) {\n primaryPart = primaryPart.appendData(':', '');\n }\n\n title = title.replaceAmpersand();\n primaryPart = primaryPart.appendData(title, ' ');\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n container1 = container1.appendData('Code of Federal Regulations, vol. 3', ', ');\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n\tpublicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n //pageNumber\n let pageNumber = shared.getStringValue(refData.pageNumber);\n pageNumber = shared.formatPageNumbers(pageNumber);\n container1 = container1.appendData(pageNumber, ', ');\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n //filter out our contribs to only custom \n let customContribs = [];\n customContribs = shared.getContributorsByType('custom', refData.contributors);\n\n //make a copy of refdata to pass off to the shared code\n let fakeRefDate = new Object();\n fakeRefDate.title = refData.title;\n fakeRefDate.contributors = customContribs;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(fakeRefDate, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryCustomContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\n\n let title = '';\n title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.italicize();\n }\n }\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n //Translated Title\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (translatedTitle.length > 0) {\n translatedTitle = translatedTitle.replaceAmpersand();\n translatedTitle = translatedTitle.toTitleCase();\n translatedTitle = translatedTitle.italicize();\n\n primaryPart = primaryPart.appendData('[' + translatedTitle + ']', ' ', '', ''); \n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any first supplemental data needed\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //Secondary Contribs\n let secondaryContributor = getSecondaryContributorString(refData.contributors, 'directed');\n container1 = container1.appendData(secondaryContributor, ', ');\n\n //Publishers\n let publisherString = shared.getPublisherString(refData.publishers);\n container1 = container1.appendData(publisherString, ', ');\n\n //publicationDate\n let publicationDate = shared.getMonthYear(refData.publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n //platform\n let platform = shared.getStringValue(refData.platform);\n\n if (platform.length == 0) {\n //url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //platform\n let platform = shared.getStringValue(refData.platform);\n \n if (platform.length > 0) {\n platform = platform.italicize();\n container2 = container2.appendData(platform, ', ');\n\n //url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url);\n container2 = container2.appendData(url, ', ');\n }\n }\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n //format\n let format = shared.getStringValue(refData.format);\n secondSupplemental = secondSupplemental.appendData(format, '');\n\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}\n\n//this is so one off, we are just going to use this locally\nfunction getSecondaryContributorString(contributors){\n\n let contributorstring = '';\n\n if (typeof contributors === 'undefined') {\n return contributorstring;\n }\n\n if (contributors.length > 0) {\n\n //for custom contribs, only grab authors\\directors\n let secondaryContributors = shared.getContributorsByType('author', contributors);\n let directorContributors = shared.getContributorsByType('director', contributors);\n\n if (directorContributors.length > 0) {\n secondaryContributors = directorContributors;\n }\n\n if (secondaryContributors.length > 0) {\n \n contributorstring = shared.getSecondaryContributorTypeString(secondaryContributors, 'author');\n\n if (contributorstring.length > 0) {\n contributorstring = 'directed ' + contributorstring;\n }\n }\n\n }\n\n return contributorstring;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n //if our institution is the same as our author, ignore this in the citation\n let primaryRefContributor = shared.getPrimaryContributorString(refData);\n let institutionString = shared.getPublisherString(refData.institution);\n\n let fakeRefData = new Object();\n fakeRefData.title = refData.title;\n fakeRefData.contributors = refData.contributors;\n\n if (primaryRefContributor.length > 0 && institutionString.length > 0) {\n if (primaryRefContributor == institutionString + '.') {\n fakeRefData.contributors = [];\n }\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(fakeRefData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n //if our institution is the same as our author (groups), we'll use this later instead\n let institutionString = shared.getPublisherString(refData.institution);\n\n if (primaryContributor.length > 0) {\n if (primaryContributor != institutionString + '.') {\n primaryPart = primaryContributor;\n }\n }\n\n let title = shared.getStringValue(refData.title);\n let description = shared.getStringValue(refData.description);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t}\n\t\telse{\n title = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t\ttitle = title.italicize();\n\t\t}\n\t}\n else{\n if (description.length > 0) {\n title = description;\n }\n }\n \n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n\t//description\n let title = shared.getStringValue(refData.title);\n let description = shared.getStringValue(refData.description);\n\n //if we had a description but not title, we've already used this\n if (description.length > 0 && title.length == 0) {\n description = '';\n }\n\n\tcontainer1 = container1.appendData(description, ', ');\n\n\t//institution (format these like publishers)\n let institutionString = shared.getPublisherString(refData.institution);\n container1 = container1.appendData(institutionString, ', '); \n\n\t//publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getYear(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n\t// doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n } else {\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any container data needed\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n //TODO: add any supplemental data needed\n\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'workTitle';\n let isSecondaryTitle = false;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\n\n let title = '';\n title = shared.getStringValue(refData.workTitle);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.italicize();\n }\n }\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //Secondary Contribs\n let secondaryContributor = shared.getSecondaryContributorString(refData.contributors);\n container1 = container1.appendData(secondaryContributor, ', ');\n\n //description\n let description = shared.getStringValue(refData.description);\n description = shared.abbreviate(description);\n container1 = container1.appendData(description.toLowerCase(), ', ');\n\n //Publishers\n let publisherString = shared.getPublisherString(refData.publishers);\n container1 = container1.appendData(publisherString, ', ');\n\n //publicationDate\n let publicationDate = shared.getMonthYear(refData.publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type == 'series') {\n //seriesTitle\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n \n if (seriesTitle.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (seriesTitle.startsWith('[')) {\n seriesTitle = shared.removeDescriptionFromTitle(seriesTitle);\n }\n else{\n seriesTitle = seriesTitle.replaceAmpersand();\n seriesTitle = seriesTitle.toTitleCase();\n seriesTitle = seriesTitle.italicize();\n }\n \n container2 = container2.appendData(seriesTitle, ', ', '', '');\n }\n }\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n //format\n let format = shared.getStringValue(refData.format);\n secondSupplemental = secondSupplemental.appendData(format, ', ', '', '');\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'workTitle';\n let isSecondaryTitle = false;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let title = shared.getStringValue(refData.workTitle);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t}\n\t\telse{\n title = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t\ttitle = title.italicize();\n\t\t}\n\t}\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n\t//Secondary Contribs\n let secondaryContributor = shared.getSecondaryContributorString(refData.contributors);\n container1 = container1.appendData(secondaryContributor, ', ');\n\n\t//publishers\n let publisherString = shared.getPublisherString(refData.publishers);\n container1 = container1.appendData(publisherString, ', ');\n \n\t//publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n\t// doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any container data needed\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n //Description\n\tlet description = shared.getStringValue(refData.description);\n secondSupplemental = secondSupplemental.appendData(description, ', ');\n\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","/*\n*****Interview*****\n This was added after Turabian, and is based off of Personal Communications logic\n*/\n\nconst shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.description);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'description';\n let isSecondaryTitle = false;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let primaryContributor = '';\n\n if (refData.type == 'archive') {\n let fakeRefData = new Object();\n fakeRefData.contributors = shared.getContributorsByType('editor', refData.contributors);\n fakeRefData.description = refData.description;\n\n primaryContributor = shared.getPrimaryContributorCitationString(fakeRefData, titleProperty, isSecondaryTitle, true);\n }\n else{\n primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle, true);\n }\n \n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n if (citation.first.length == 0) {\n citation.first = 'Interview';\n }\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n if (refData.type == 'archive') {\n let editors = shared.getContributorsByType('editor', refData.contributors);\n primaryPart = shared.getPrimaryContributorString(refData, true, 'editor');\n }\n else{\n let primaryContributor = shared.getPrimaryContributorString(refData);\n primaryPart = primaryContributor;\n }\n\n let title = shared.getStringValue(refData.description);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t}\n\t}\n\n if (title.length > 0) {\n\n title = title.replaceAmpersand();\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = 'Interview';\n\n if (refData.type == 'archive') {\n let authors = shared.getContributorsByType('author', refData.contributors);\n\n if (authors.length > 0) {\n let authorString = shared.getSecondaryContributorTypeString(authors, 'author');\n\n if (authorString.length > 0) {\n firstSupplemental = firstSupplemental + ' with ' + authorString.replace('by ', '');\n }\n }\n }\n \n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n //publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let publisherString = shared.getPublisherString(refData.publishers);\n container2 = container2.appendData(publisherString);\n\n\tcontainer2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0 || kind.length == 0) {\n return 'Type and Kind required.';\n }\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.articleTitle);\n\n if (refData.kind == 'section') {\n citationTitle = shared.getStringValue(refData.sectionTitle);\n }\n\n if (refData.kind == 'issue') {\n citationTitle = shared.getStringValue(refData.issueTitle);\n }\n\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'articleTitle';\n let isSecondaryTitle = true;\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (kind == 'section') {\n titleProperty = 'sectionTitle';\n isSecondaryTitle = true;\n }\n\n if (kind == 'issue') {\n titleProperty = 'issueTitle';\n isSecondaryTitle = true;\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let title = '';\n \n if (type == 'special') {\n \n if (kind == 'section') {\n title = shared.getStringValue(refData.sectionTitle);\n }\n\n if (kind == 'issue') {\n title = shared.getStringValue(refData.issueTitle);\n }\n }\n else {\n title = shared.getStringValue(refData.articleTitle);\n }\n \n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n\n if (type == 'special' && kind == 'issue') {\n title = title.italicize();\n }\n else {\n title = title.doubleQuote();\n }\n }\n }\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n //translatedTitle\n let translatedTitle = '';\n\n if (type == 'special') {\n \n if (kind == 'section') {\n translatedTitle = shared.getStringValue(refData.translatedSectionTitle);\n }\n\n if (kind == 'issue') {\n translatedTitle = shared.getStringValue(refData.translatedIssueTitle);\n }\n }\n else {\n translatedTitle = shared.getStringValue(refData.translatedArticleTitle);\n }\n\n if (translatedTitle.length > 0) {\n translatedTitle = translatedTitle.replaceAmpersand();\n translatedTitle = translatedTitle.toTitleCase();\n\n if (type == 'special' && kind == 'issue') {\n translatedTitle = translatedTitle.italicize();\n }\n else {\n translatedTitle = translatedTitle.doubleQuote();\n }\n\n if (title.length > 0) {\n translatedTitle = '[' + translatedTitle + ']';\n }\n \n primaryPart = primaryPart.appendData(translatedTitle, ' ', '', ''); \n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type != 'reprinted' || kind != 'article') {\n //originalPublicationDate \n let originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n originalPublicationDate = shared.getFullDate(originalPublicationDate);\n originalPublicationDate = shared.formatOriginalPublicationDate(originalPublicationDate);\n firstSupplemental = firstSupplemental.appendData(originalPublicationDate, ', '); \n }\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //journalTitle\n let journalTitle = shared.getStringValue(refData.journalTitle);\n\n if (journalTitle.length > 0) {\n journalTitle = journalTitle.replaceAmpersand();\n journalTitle = journalTitle.toTitleCase();\n journalTitle = journalTitle.italicize();\n\n let prefix = '';\n\n if (type == 'special') {\n\n if (kind == 'section') {\n prefix = 'Special section of';\n }\n\n if (kind == 'issue') {\n prefix = 'Special issue of';\n }\n }\n\n container1 = container1.appendData(journalTitle, ', ', prefix);\n }\n\n //Secondary Contribs\n let secondaryContributor = shared.getSecondaryContributorString(refData.contributors);\n container1 = container1.appendData(secondaryContributor, ', ');\n\n //volume\n let volume = shared.getStringValue(refData.volume);\n container1 = container1.appendData(volume, ', ', 'vol.', '');\n\n //issue\n let issue = shared.getStringValue(refData.issue);\n container1 = container1.appendData(issue, ', ', 'no.', '');\n\n if (kind == 'advance' || kind == 'inPress') {\n container1 = container1.appendData('forthcoming', ', ');\n }\n \n //publicationDate\n let publicationDate = shared.getMonthYear(refData.publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n \n //referencePages\n let referencePages = shared.getStringValue(refData.referencePages);\n referencePages = shared.formatPageNumbers(referencePages);\n container1 = container1.appendData(referencePages, ', ');\n\n //articleNumber\n let articleNumber = shared.getStringValue(refData.articleNumber);\n container1 = container1.appendData(articleNumber, ', ', 'article', '');\n\n if (type != 'database') {\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n }\n\n\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type != 'database') {\n //retrievalDate\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n retrievalDate = shared.getFullDate(retrievalDate);\n container2 = container2.appendData(retrievalDate, ', ', 'accessed', '');\n }\n\n let originalInfo = '';\n\n if (type == 'reprinted' && kind == 'article') {\n // 'Originally published as', originalArticleTitle, originalJournaltitle, originalVolume, originalIssue, origianlPublicationDate, originalPages, originalURL/DOI.\"\n \n let hasTitle = false;\n\n //originalArticleTitle\n let originalArticleTitle = shared.getStringValue(refData.originalArticleTitle);\n let articleTitle = shared.getStringValue(refData.articleTitle);\n\n if (originalArticleTitle.length > 0 && originalArticleTitle != articleTitle) {\n //if this is a description, remove the brackets and don't italicize\n if (originalArticleTitle.startsWith('[')) {\n originalArticleTitle = shared.removeDescriptionFromTitle(originalArticleTitle);\n }\n else{\n originalArticleTitle = originalArticleTitle.replaceAmpersand();\n originalArticleTitle = originalArticleTitle.toTitleCase();\n originalArticleTitle = originalArticleTitle.doubleQuote();\n }\n \n originalInfo = originalInfo.appendData(originalArticleTitle, ', ', '', '');\n hasTitle = true;\n }\n\n //originalJournalTitle\n let originalJournalTitle = shared.getStringValue(refData.originalJournalTitle);\n let journalTitle = shared.getStringValue(refData.journalTitle);\n\n if (originalJournalTitle.length > 0 && originalJournalTitle != journalTitle) {\n originalJournalTitle = originalJournalTitle.replaceAmpersand();\n originalJournalTitle = originalJournalTitle.toTitleCase();\n originalJournalTitle = originalJournalTitle.italicize();\n originalInfo = originalInfo.appendData(originalJournalTitle, ', ');\n hasTitle = true;\n }\n\n //originalVolume\n let originalVolume = shared.getStringValue(refData.originalVolume);\n originalInfo = originalInfo.appendData(originalVolume, ', ', 'vol.', '');\n\n //originalIssue\n let originalIssue = shared.getStringValue(refData.originalIssue);\n originalInfo = originalInfo.appendData(originalIssue, ', ', 'no.', '');\n\n //originalPublicationDate\n let originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n originalPublicationDate = shared.getFullDate(originalPublicationDate);\n originalPublicationDate = shared.formatOriginalPublicationDate(originalPublicationDate);\n originalInfo = originalInfo.appendData(originalPublicationDate, ', '); \n\n //originalPages\n let originalPages = shared.getStringValue(refData.originalPages);\n originalPages = shared.formatPageNumbers(originalPages);\n originalInfo = originalInfo.appendData(originalPages, ', ');\n\n // original doi/url\n let originalUrl = shared.getStringValue(refData.originalUrl);\n let originalDoi = shared.getStringValue(refData.originalDoi);\n\n if (originalDoi.length > 0) {\n originalDoi = shared.appendDOIURL(originalDoi);\n originalInfo = originalInfo.appendData(originalDoi, ', ');\n }\n else{\n if (originalUrl.length > 0) {\n originalUrl = shared.formatURL(originalUrl);\n originalInfo = originalInfo.appendData(originalUrl, ', ');\n }\n }\n \n if (originalInfo.length > 0) {\n\n if (hasTitle) {\n container2 = container2.appendData(originalInfo, ', ', 'originally published as', '');\n }\n else {\n container2 = container2.appendData(originalInfo, ', ', 'originally published in', '');\n }\n }\n }\n\n if (kind == 'editorial') {\n container2 = container2.appendData('editorial', ', ');\n }\n\n if (kind == 'retracted') {\n //Retraction volume, retraction issue, retraction date, retraction pages, retraction doi/url.\n\n let retractionInfo = '';\n\n //retractionVolume\n let retractionVolume = shared.getStringValue(refData.retractionVolume);\n retractionInfo = retractionInfo.appendData(retractionVolume, ', ', 'vol.', '');\n\n //retractionIssue\n let retractionIssue = shared.getStringValue(refData.retractionIssue);\n retractionInfo = retractionInfo.appendData(retractionIssue, ', ', 'no.', '');\n\n //retractionDate\n let retractionDate = shared.getStringValue(refData.retractionDate);\n retractionDate = shared.getFullDate(retractionDate);\n retractionInfo = retractionInfo.appendData(retractionDate, ', ');\n \n //retractionPages\n let retractionPages = shared.getStringValue(refData.retractionPages);\n retractionPages = shared.formatPageNumbers(retractionPages);\n retractionInfo = retractionInfo.appendData(retractionPages, ', ');\n\n //retractionArticleNumber\n let retractionArticleNumber = shared.getStringValue(refData.retractionArticleNumber);\n retractionInfo = retractionInfo.appendData(retractionArticleNumber, ', ', 'article', '');\n\n // doi/url\n let retractionURL = shared.getStringValue(refData.retractionURL);\n let retractionDOI = shared.getStringValue(refData.retractionDOI);\n\n if (retractionDOI.length > 0) {\n retractionDOI = shared.appendDOIURL(retractionDOI);\n retractionInfo = retractionInfo.appendData(retractionDOI, ', ');\n }\n else{\n if (retractionURL.length > 0) {\n retractionURL = shared.formatURL(retractionURL);\n retractionInfo = retractionInfo.appendData(retractionURL, ', ');\n }\n }\n\n if (retractionInfo.length > 0) {\n container2 = container2.appendData(retractionInfo, ', ', 'Retracted in');\n }\n }\n\n if (type == 'database') {\n\n //databaseTitle\n let databaseTitle = shared.getStringValue(refData.databaseTitle);\n\n if (databaseTitle.length > 0) {\n databaseTitle = databaseTitle.replaceAmpersand();\n databaseTitle = databaseTitle.toTitleCase();\n databaseTitle = databaseTitle.italicize();\n container2 = container2.appendData(databaseTitle, ', ', '', '');\n }\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container2 = container2.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container2 = container2.appendData(url, ', ');\n }\n }\n }\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n if (type == 'database') {\n\n //retrievalDate\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n retrievalDate = shared.getFullDate(retrievalDate);\n secondSupplemental = secondSupplemental.appendData(retrievalDate, ', ', 'accessed', '');\n }\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let title = shared.getStringValue(refData.title);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t}\n\t\telse{\n title = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t\ttitle = title.italicize();\n\t\t}\n\t}\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n else {\n //if we don't have a title, see if we have a format that we can use in it's place\n let format = shared.getStringValue(refData.format);\n if (format.length > 0) {\n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + format;\n }\n else{\n primaryPart = format;\n }\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n //Publishers\n let publisherString = shared.getPublisherString(refData.publishers);\n container1 = container1.appendData(publisherString, ', ');\n\n\t//publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n\t//url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n \n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n\t//format\n\tlet format = shared.getStringValue(refData.format);\n if (format.length > 0) {\n\n let title = shared.getStringValue(refData.title);\n\n //if we don't have a title, then we have already used the format field in the primary section\n if (title.length > 0) {\n secondSupplemental = secondSupplemental.appendData(format, ', ');\n }\n }\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n\tlet primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n\t\tauthorPart: primaryContributor,\n\t\tauthorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n\t\tauthorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n\tcitationTitle = shared.getStringValue(refData.articleTitle);\n\n\tlet type = shared.getStringValue(refData.type);\n\tlet kind = shared.getStringValue(refData.kind);\n\n\tif(kind === 'section'){\n\t\tcitationTitle = shared.getStringValue(refData.sectionTitle);\n\t}\n\n\tif (kind == 'issue') {\n\t\tcitationTitle = shared.getStringValue(refData.issueTitle);\n\t}\n\n\tcitationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n\tlet titleProperty = 'title';\n\tlet isSecondaryTitle = false;\n\tlet primaryContributor;\n\n\tlet type = shared.getStringValue(refData.type);\n\tlet kind = shared.getStringValue(refData.kind);\n\n\tif(refData.contributors.length === 0){\n\t\t// no contributors exisit\n\t\tif(type === 'magazine' || type === 'reprinted'){\n\t\t\ttitleProperty = 'articleTitle';\n\t\t} else {\n\t\t\tif(kind === 'section'){\n\t\t\t\ttitleProperty = 'sectionTitle';\n\t\t\t}\n\n\t\t\tif (kind == 'issue') {\n\t\t\t\ttitleProperty = 'issueTitle';\n\t\t\t}\n\t\t\t\n\t\t}\n\t\tisSecondaryTitle = true;\n\n\t\tprimaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n\t} else {\n\t\tprimaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n\t}\n \n\tlet citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n\tlet shortenPageNumber = true;\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate, shortenPageNumber);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\n\tlet kind = shared.getStringValue(refData.kind);\n\n let title = '';\n\tif(type === 'special'){\n\t\tif(kind === 'section'){\n\t\t\ttitle = shared.getStringValue(refData.sectionTitle);\t\n\t\t\tif (title.length > 0) {\n\t\t\t\ttitle = title.replaceAmpersand();\n\t\t\t\ttitle = title.toTitleCase();\n\t\t\t\ttitle = title.doubleQuote();\n\t\t\t}\n\t\t} else if(kind === 'issue'){\n\t\t\ttitle = shared.getStringValue(refData.issueTitle);\t\n\t\t\tif (title.length > 0) {\n\t\t\t\ttitle = title.replaceAmpersand();\n\t\t\t\ttitle = title.toTitleCase();\n\t\t\t\ttitle = title.italicize();\n\t\t\t}\n\t\t}\n\t} else {\n\t\ttitle = shared.getStringValue(refData.articleTitle);\n\t\tif (title.length > 0) {\n\t\t\ttitle = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t\ttitle = title.doubleQuote();\n\t\t}\n\t}\n\n if (title.length > 0) {\n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n\tif(type === 'magazine' || type === 'reprinted'){\n\t\t//translatedArticleTitle\n\t\tlet translatedArticleTitle = shared.getStringValue(refData.translatedArticleTitle);\n\t\tif(translatedArticleTitle.length > 0){\n\t\t\ttranslatedArticleTitle = translatedArticleTitle.replaceAmpersand();\n\t\t\ttranslatedArticleTitle = translatedArticleTitle.toTitleCase();\n\t\t\ttranslatedArticleTitle = translatedArticleTitle.doubleQuote();\n\t\t\tprimaryPart = primaryPart.appendData('[' + translatedArticleTitle + ']', ' ', '', ''); \n\t\t}\n\t} else {\n\t\tif(kind === 'section'){\n\t\t\t//translatedSectionTitle\n\t\t\tlet translatedSectionTitle = shared.getStringValue(refData.translatedSectionTitle);\n\t\t\tif(translatedSectionTitle.length > 0){\n\t\t\t\ttranslatedSectionTitle = translatedSectionTitle.replaceAmpersand();\n\t\t\t\ttranslatedSectionTitle = translatedSectionTitle.toTitleCase();\n\t\t\t\ttranslatedSectionTitle = translatedSectionTitle.doubleQuote();\n\t\t\t\tprimaryPart = primaryPart.appendData('[' + translatedSectionTitle + ']', ' ', '', ''); \n\t\t\t}\n\t\t} else if(kind === 'issue'){\n\t\t\t//translatedIssueTitle\n\t\t\tlet translatedIssueTitle = shared.getStringValue(refData.translatedIssueTitle);\n\t\t\tif(translatedIssueTitle.length > 0){\n\t\t\t\ttranslatedIssueTitle = translatedIssueTitle.replaceAmpersand();\n\t\t\t\ttranslatedIssueTitle = translatedIssueTitle.toTitleCase();\n\t\t\t\ttranslatedIssueTitle = translatedIssueTitle.italicize();\n\t\t\t\tprimaryPart = primaryPart.appendData('[' + translatedIssueTitle + ']', ' ', '', ''); \n\t\t\t}\n\t\t}\n\t}\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n\tif(type === 'magazine' && kind !== 'retracted'){\n\t\t// originalPublicationDate\n\t\tlet originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n\t\toriginalPublicationDate = shared.getFullDate(originalPublicationDate);\n\t\tfirstSupplemental = firstSupplemental.appendData(originalPublicationDate, ', ');\n\t}\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\t\n\t//magazineTitle\n\tlet magazineTitle = shared.getStringValue(refData.magazineTitle);\n if (magazineTitle.length > 0) {\n\t\tmagazineTitle = magazineTitle.replaceAmpersand();\n\t\tmagazineTitle = magazineTitle.toTitleCase();\n\t\tmagazineTitle = magazineTitle.italicize();\n\t\tif(type === 'special'){\n\t\t\tif(kind === 'section'){\n\t\t\t\tcontainer1 = container1.appendData(magazineTitle, ', ', 'Special section of');\n\t\t\t} else if(kind === 'issue'){\n\t\t\t\tcontainer1 = container1.appendData(magazineTitle, ', ', 'Special issue of');\n\t\t\t}\n\t\t} else {\n\t\t\tcontainer1 = container1.appendData(magazineTitle, ', ');\n\t\t}\n\t\t\n\t}\n\n\t//Secondary Contribs\n let secondaryContributor = shared.getSecondaryContributorString(refData.contributors);\n container1 = container1.appendData(secondaryContributor, ', ');\n\n\t//volume\n let volume = shared.getStringValue(refData.volume);\n container1 = container1.appendData(volume, ', ', 'vol.', '');\n\n //issue\n let issue = shared.getStringValue(refData.issue);\n container1 = container1.appendData(issue, ', ', 'no.', '');\n\n\t//publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n\t//referencePages\n\tlet referencePages = shared.getStringValue(refData.referencePages);\n\treferencePages = shared.formatPageNumbers(referencePages);\n container1 = container1.appendData(referencePages, ', ');\n\n\t// doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n } else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\t\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n\tif(type === 'magazine' && kind === 'retracted'){\n\t\tcontainer2 = 'Retracted in';\n\n\t\t//retractionVolume\n\t\tlet retractionVolume = shared.getStringValue(refData.retractionVolume);\n\t\tcontainer2 = container2.appendData(retractionVolume, ' ', 'vol.');\n\t\n\t\t//retractionIssue\n\t\tlet retractionIssue = shared.getStringValue(refData.retractionIssue);\n\t\tif(retractionVolume.length > 0){\n\t\t\tcontainer2 = container2.appendData(retractionIssue, ', ', 'no.');\n\t\t} else {\n\t\t\t// there isn't a volume, so dont have a comma \n\t\t\tcontainer2 = container2.appendData(retractionIssue, ' ', 'no.');\n\t\t}\n\n\t\t// retractionDate\n\t\tlet retractionDate = shared.getStringValue(refData.retractionDate);\n\t\tretractionDate = shared.getFullDate(retractionDate);\n\t\tif(retractionVolume.length > 0 || retractionIssue.length > 0){\n\t\t\tcontainer2 = container2.appendData(retractionDate, ', ');\n\t\t} else {\n\t\t\t// there isn't a volume or an issue, so dont have a comma\n\t\t\tcontainer2 = container2.appendData(retractionDate, ' ');\n\t\t}\n\t\t\n\t\t\n\t\t//retractionPages\n\t\tlet retractionPages = shared.getStringValue(refData.retractionPages);\n\t\tretractionPages = shared.formatPageNumbers(retractionPages);\n\t\tcontainer2 = container2.appendData(retractionPages, ', ');\n\n\t\t// retractionUrl/retractionDoi\n\t\tlet retractionUrl = shared.getStringValue(refData.retractionURL);\n\t\tlet retractionDoi = shared.getStringValue(refData.retractionDOI);\n\n\t\tif (retractionDoi.length > 0) {\n\t\t\tretractionDoi = shared.appendDOIURL(retractionDoi);\n\t\t\tcontainer2 = container2.appendData(retractionDoi, ', ');\n\t\t} else if (retractionUrl.length > 0) {\n\t\t\tretractionUrl = shared.formatURL(retractionUrl);\n\t\t\tcontainer2 = container2.appendData(retractionUrl, ', ');\n\t\t}\n\t}\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n\tlet kind = shared.getStringValue(refData.kind);\n\t\n\tif(type === 'reprinted'){\n\t\t//originalArticleTitle\n\t\tlet originalArticleTitle = shared.getStringValue(refData.originalArticleTitle);\n\t\tif (originalArticleTitle.length > 0) {\n\t\t\toriginalArticleTitle = originalArticleTitle.replaceAmpersand();\n\t\t\toriginalArticleTitle = originalArticleTitle.toTitleCase();\n\t\t\toriginalArticleTitle = originalArticleTitle.doubleQuote();\n\t\t\tsecondSupplemental = secondSupplemental.appendData(originalArticleTitle, ', ', 'Originally published as');\n\t\t}\n\n\t\t//originalMagazineTitle\n\t\tlet originalMagazineTitle = shared.getStringValue(refData.originalMagazineTitle);\n\t\tif (originalMagazineTitle.length > 0) {\n\t\t\toriginalMagazineTitle = originalMagazineTitle.replaceAmpersand();\n\t\t\toriginalMagazineTitle = originalMagazineTitle.toTitleCase();\n\t\t\toriginalMagazineTitle = originalMagazineTitle.italicize();\n\t\t\tsecondSupplemental = secondSupplemental.appendData(originalMagazineTitle, ', ',);\n\t\t}\n\n\t\t//originalVolume\n\t\tlet originalVolume = shared.getStringValue(refData.originalVolume);\n\t\tsecondSupplemental = secondSupplemental.appendData(originalVolume, ', ', 'vol.', '');\n\t\n\t\t//originalIssue\n\t\tlet originalIssue = shared.getStringValue(refData.originalIssue);\n\t\tsecondSupplemental = secondSupplemental.appendData(originalIssue, ', ', 'no.', '');\n\t\t\n\t\t\t\n\t\t// originalPublicationDate\n\t\tlet originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n\t\toriginalPublicationDate = shared.getFullDate(originalPublicationDate);\n\t\tsecondSupplemental = secondSupplemental.appendData(originalPublicationDate, ', ');\n\t\t\n\t\t//originalPages\n\t\tlet originalPages = shared.getStringValue(refData.originalPages);\n\t\toriginalPages = shared.formatPageNumbers(originalPages);\n\t\tsecondSupplemental = secondSupplemental.appendData(originalPages, ', ');\n\n\t\t// originalDoi/originalUrl\n\t\tlet originalUrl = shared.getStringValue(refData.originalUrl);\n\t\tlet originalDoi = shared.getStringValue(refData.originalDoi);\n\n\t\tif (originalDoi.length > 0) {\n\t\t\toriginalDoi = shared.appendDOIURL(originalDoi);\n\t\t\tsecondSupplemental = secondSupplemental.appendData(originalDoi, ', ');\n\t\t} else if (originalUrl.length > 0) {\n\t\t\toriginalUrl = shared.formatURL(originalUrl);\n\t\t\tsecondSupplemental = secondSupplemental.appendData(originalUrl, ', ');\n\t\t}\n\t}\n\n if(kind === 'editorial'){\n\t\tsecondSupplemental = 'Editorial';\n\t}\n\n\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'workTitle';\n let isSecondaryTitle = false;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\n\n let title = shared.getStringValue(refData.workTitle);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.italicize();\n }\n\n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //Secondary Contribs\n let secondaryContributor = shared.getSecondaryContributorString(refData.contributors);\n container1 = container1.appendData(secondaryContributor, ', ');\n\n let publishers = shared.getPublisherString(refData.publishers);\n\n //Manuscripts have some custom logic for publishers\n /*\n \"Manuscripts list the author's institutional affiliation instead of a publisher. \n Include the department, institution, and location information separated by a comma if possible.\"\n */\n\n publishers = publishers.split('Department').join('Dept.');\n publishers = publishers.split('University').join('U');\n\n container1 = container1.appendData(publishers, ', ');\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n publicationDate = shared.formatOriginalPublicationDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publishers == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publishers)) {\n container1 = container1.upperFirstLetter();\n }\n }\n\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n let title = shared.getStringValue(refData.workTitle);\n let isDescription = false;\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n isDescription = true;\n }\n } \n\n if (!isDescription) {\n secondSupplemental = secondSupplemental.appendData('Manuscript.', '');\n }\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n if (refData.type == 'album') {\n citationTitle = shared.getStringValue(refData.albumTitle);\n }else if (refData.type == 'song') {\n citationTitle = shared.getStringValue(refData.songTitle);\n }\n\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = '';\n let isSecondaryTitle = false;\n\n\tlet type = shared.getStringValue(refData.type);\n\t\n\t// console.log('type ' + type);\n\t\n\tif(type === 'album'){\n\t\ttitleProperty = 'albumTitle';\n\t} else if(type === 'song'){\n\t\ttitleProperty = 'songTitle';\n\t}\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\n\n\tif(type === 'album'){\n\t\t//albumTitle\n\t\tlet albumTitle = shared.getStringValue(refData.albumTitle);\n\t\tif(albumTitle.length > 0){\n\t\t\talbumTitle = albumTitle.replaceAmpersand();\n albumTitle = albumTitle.toTitleCase();\n\t\t\talbumTitle = albumTitle.italicize();\n\t\t\tprimaryPart = primaryPart.appendData(albumTitle, ' ');\n\t\t}\n\t} else if(type === 'song'){\n\t\t//songTitle\n\t\tlet songTitle = shared.getStringValue(refData.songTitle);\n\t\t\n\t\tif(songTitle.length > 0){\n\t\t\t//if this is a description, remove the brackets and don't italicize\n\t\t\tif (songTitle.startsWith('[')) {\n\t\t\t\tsongTitle = shared.removeDescriptionFromTitle(songTitle);\n\t\t\t} else {\n songTitle = songTitle.replaceAmpersand();\n\t\t\t\tsongTitle = songTitle.toTitleCase();\n\t\t\t\tsongTitle = songTitle.doubleQuote();\n\t\t\t}\n\t\t\tprimaryPart = primaryPart.appendData(songTitle, ' ');\n\t\t}\n\t}\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n\n if(kind === 'cover'){\n\t\t//originalPublicationDate\n\t\tlet originalPublicationDate = shared.getYear(refData.originalPublicationDate);\n firstSupplemental = firstSupplemental.appendData(originalPublicationDate, ', '); \n\t}\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n\tif(type === 'song'){\n\t\tlet albumTitle = shared.getStringValue(refData.albumTitle);\n\t\tif(albumTitle.length > 0){\n\t\t\t//if this is a description, remove the brackets and don't italicize\n\t\t\tif (albumTitle.startsWith('[')) {\n\t\t\t\talbumTitle = shared.removeDescriptionFromTitle(albumTitle);\n\t\t\t} else {\n albumTitle = albumTitle.replaceAmpersand();\n\t\t\t\talbumTitle = albumTitle.toTitleCase();\n\t\t\t\talbumTitle = albumTitle.italicize();\n\t\t\t}\n\n\t\t\tcontainer1 = container1.appendData(albumTitle, ' ');\n\t\t}\n\t}\n\n\tif(kind === 'cover'){\n\t\t//Secondary Contribs\n\t\tlet secondaryContributor = shared.getSecondaryContributorString(refData.contributors);\n\t\tcontainer1 = container1.appendData(secondaryContributor, ', ');\n\t}\n\n //format\n let format = shared.getStringValue(refData.format);\n\tcontainer1 = container1.appendData(format, ', ');\n\n\t//publishers\n let publisherString = shared.getPublisherString(refData.publishers);\n container1 = container1.appendData(publisherString, ', ');\n\n\t//publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n\t//url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //medium\n let medium = shared.getStringValue(refData.medium);\n\tcontainer2 = container2.appendData(medium, ', ');\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n //TODO: add any supplemental data needed\n\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n\tlet secondSupplemental = getSecondSupplemental(refData);\n let containerTwo = getContainerTwo(refData);\n\n let referenceValue = primaryInfo;\n\n\tlet type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\t\n\t// this type and kind has 2nd supplemental inbetween the containers\n\tif(type === 'reprinted' && kind === 'editorial'){\n\t\tif (secondSupplemental.length > 0) {\n\t\t\treferenceValue = referenceValue + ' ' + secondSupplemental;\n\t\t}\n\t\tif (containerTwo.length > 0) {\n\t\t\treferenceValue = referenceValue + ' ' + containerTwo;\n\t\t}\n\t} else {\n\t\t// all other types and kind have the 2nd supplemental at the end like normal\n\t\tif (containerTwo.length > 0) {\n\t\t\treferenceValue = referenceValue + ' ' + containerTwo;\n\t\t}\n\t\tif (secondSupplemental.length > 0) {\n\t\t\treferenceValue = referenceValue + ' ' + secondSupplemental;\n\t\t}\n\t}\n\n\tlet primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n\t\tauthorPart: primaryContributor,\n\t\tauthorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n\t\tauthorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n\tcitationTitle = shared.getStringValue(refData.articleTitle);\n\n if (refData.kind == 'issue') {\n citationTitle = shared.getStringValue(refData.issueTitle);\n }\n\n\tif (refData.kind == 'section') {\n citationTitle = shared.getStringValue(refData.sectionTitle);\n }\n\n\tcitationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'articleTitle';\n let isSecondaryTitle = true;\n\n\tlet type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n\tif (kind == 'issue') {\n\t\ttitleProperty = 'issueTitle';\n\t\tisSecondaryTitle = false;\n\t}\n\n\tif (kind == 'section') {\n\t\ttitleProperty = 'sectionTitle';\n\t\tisSecondaryTitle = true;\n\t}\n\n\tlet citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n\tlet shortenPageNumber = true;\n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate, shortenPageNumber);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n\tlet type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n\tlet title = '';\n\t\n\tif(type === 'special'){\n\t\tif(kind ==='section'){\n\t\t\ttitle = shared.getStringValue(refData.sectionTitle);\n\t\t} else if(kind === 'issue'){\n\t\t\ttitle = shared.getStringValue(refData.issueTitle);\n\t\t}\n\t} else {\n\t\ttitle = shared.getStringValue(refData.articleTitle);\n\t}\n \n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t}\n\t\telse{\n\t\t\ttitle = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t}\n\t}\n\n\tif(type === 'special'){\n\t\tif(kind ==='section'){\n\t\t\ttitle = title.doubleQuote();\t\n\t\t} else if(kind === 'issue'){\n\t\t\ttitle = title.italicize();\n\t\t}\n\t} else {\n\t\ttitle = title.doubleQuote();\n\t}\n\n\n if (title.length > 0) {\n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\t\n\tif(type === 'special'){\n\t\tif(kind ==='section'){\n\t\t\t//translatedSectionTitle\n\t\t\tlet translatedSectionTitle = shared.getStringValue(refData.translatedSectionTitle);\n\t\t\tif(translatedSectionTitle.length > 0){\n\t\t\t\ttranslatedSectionTitle = translatedSectionTitle.replaceAmpersand();\n\t\t\t\ttranslatedSectionTitle = translatedSectionTitle.toTitleCase();\n\t\t\t\ttranslatedSectionTitle = translatedSectionTitle.doubleQuote();\n\t\t\t\tprimaryPart = primaryPart.appendData('[' + translatedSectionTitle + ']', ' ', '', ''); \n\t\t\t}\n\t\t} else if(kind ==='issue'){\n\t\t\t//translatedIssueTitle\n\t\t\tlet translatedIssueTitle = shared.getStringValue(refData.translatedIssueTitle);\n\t\t\tif(translatedIssueTitle.length > 0){\n\t\t\t\ttranslatedIssueTitle = translatedIssueTitle.replaceAmpersand();\n\t\t\t\ttranslatedIssueTitle = translatedIssueTitle.toTitleCase();\n\t\t\t\ttranslatedIssueTitle = translatedIssueTitle.italicize();\n\t\t\t\tprimaryPart = primaryPart.appendData('[' + translatedIssueTitle + ']', ' ', '', ''); \n\t\t\t}\n\t\t}\n\t} else {\n\t\t//translatedArticleTitle\n\t\tlet translatedArticleTitle = shared.getStringValue(refData.translatedArticleTitle);\n\t\tif(translatedArticleTitle.length > 0){\n\t\t\ttranslatedArticleTitle = translatedArticleTitle.replaceAmpersand();\n\t\t\ttranslatedArticleTitle = translatedArticleTitle.toTitleCase();\n\t\t\ttranslatedArticleTitle = translatedArticleTitle.doubleQuote();\n\t\t\tprimaryPart = primaryPart.appendData('[' + translatedArticleTitle + ']', ' ', '', ''); \n\t\t}\n\t}\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n\tlet type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n\tif(type === 'newspaper' && (kind === 'article' || kind === 'editorial' || kind === 'foreign')){\n\t\t// originalPublicationDate\n\t\tlet originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n\t\toriginalPublicationDate = shared.getFullDate(originalPublicationDate);\n\t\tfirstSupplemental = firstSupplemental.appendData(originalPublicationDate, ', ');\n\t}\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\t\n\tlet type = shared.getStringValue(refData.type);\n\tlet kind = shared.getStringValue(refData.kind);\n\n // newspaperTitle\n\tlet newspaperTitle = shared.getStringValue(refData.newspaperTitle);\n\tif (newspaperTitle.length > 0) {\n\t\tnewspaperTitle = newspaperTitle.replaceAmpersand();\n\t\tnewspaperTitle = newspaperTitle.toTitleCase();\n\t\tnewspaperTitle = newspaperTitle.italicize();\n\t\t\n\t\tif(type === 'special'){\n\t\t\tif(kind ==='section'){\n\t\t\t\tcontainer1 = container1.appendData(newspaperTitle, ', ', 'Special section of');\n\t\t\t} else if(kind ==='issue'){\n\t\t\t\tcontainer1 = container1.appendData(newspaperTitle, ', ', 'Special issue of');\n\t\t\t}\n\t\t} else {\n\t\t\tcontainer1 = container1.appendData(newspaperTitle, ', ');\n\t\t}\n\n\t}\n\n\t//Secondary Contribs\n let secondaryContributor = shared.getSecondaryContributorString(refData.contributors);\n container1 = container1.appendData(secondaryContributor, ', ');\n\n\t//publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n\t//referencePages\n\tlet referencePages = shared.getStringValue(refData.referencePages);\n\treferencePages = shared.formatPageNumbers(referencePages, true);\n container1 = container1.appendData(referencePages, ', ');\n\n\t// doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n } else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\t\n\n\tcontainer1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\n// 2nd supplemental goes inbetween the containers (for newspaper / editorial)\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\t\n\tlet type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n \n\tif(kind === 'editorial'){\n\t\tsecondSupplemental = 'Editorial';\n\t}\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n \n\tlet type = shared.getStringValue(refData.type);\n\tlet kind = shared.getStringValue(refData.kind);\n\n\tif(type === 'reprinted'){\n\t\t//originalArticleTitle\n\t\tlet originalArticleTitle = shared.getStringValue(refData.originalArticleTitle);\n\t\tif (originalArticleTitle.length > 0) {\n\t\t\toriginalArticleTitle = originalArticleTitle.replaceAmpersand();\n\t\t\toriginalArticleTitle = originalArticleTitle.toTitleCase();\n\t\t\toriginalArticleTitle = originalArticleTitle.doubleQuote();\n\t\t\tcontainer2 = container2.appendData(originalArticleTitle, ', ', 'Originally published as');\n\t\t}\n\n\t\t//originalNewspaperTitle\n\t\tlet originalNewspaperTitle = shared.getStringValue(refData.originalNewspaperTitle);\n\t\tif (originalNewspaperTitle.length > 0) {\n\t\t\toriginalNewspaperTitle = originalNewspaperTitle.replaceAmpersand();\n\t\t\toriginalNewspaperTitle = originalNewspaperTitle.toTitleCase();\n\t\t\toriginalNewspaperTitle = originalNewspaperTitle.italicize();\n\t\t\tcontainer2 = container2.appendData(originalNewspaperTitle, ', ',);\n\t\t}\n\t\t\t\n\t\t// originalPublicationDate\n\t\tlet originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n\t\toriginalPublicationDate = shared.getFullDate(originalPublicationDate);\n\t\tcontainer2 = container2.appendData(originalPublicationDate, ', ');\n\t\t\n\t\t//originalPages\n\t\tlet originalPages = shared.getStringValue(refData.originalPages);\n\t\toriginalPages = shared.formatPageNumbers(originalPages);\n\t\tcontainer2 = container2.appendData(originalPages, ', ');\n\n\t\t// originalDoi/originalUrl\n\t\tlet originalUrl = shared.getStringValue(refData.originalUrl);\n\t\tlet originalDoi = shared.getStringValue(refData.originalDoi);\n\t\n\t\tif (originalDoi.length > 0) {\n\t\t\toriginalDoi = shared.appendDOIURL(originalDoi);\n\t\t\tcontainer2 = container2.appendData(originalDoi, ', ');\n\t\t} else if (originalUrl.length > 0) {\n\t\t\toriginalUrl = shared.formatURL(originalUrl);\n\t\t\tcontainer2 = container2.appendData(originalUrl, ', ');\n\t\t}\n\n\t} else if(kind === 'retracted'){\n\t\t//retractionDate\n\t\tlet retractionDate = shared.getStringValue(refData.retractionDate);\n\t retractionDate = shared.getFullDate(retractionDate);\n\n\t\tlet prefix = 'Retracted in';\n\t\tif (retractionDate.length > 4) {\n\t\t\tprefix = 'Retracted on';\n\t\t}\n\n\t\tcontainer2 = container2.appendData(retractionDate, ', ', prefix);\n\n\t\t//retractionPages\n\t\tlet retractionPages = shared.getStringValue(refData.retractionPages);\n\t\tretractionPages = shared.formatPageNumbers(retractionPages);\n\t\tcontainer2 = container2.appendData(retractionPages, ', ');\n\n\t\t// retractionDOI/retractionURL\n\t\tlet retractionURL = shared.getStringValue(refData.retractionURL);\n\t\tlet retractionDOI = shared.getStringValue(refData.retractionDOI);\n\t\n\t\tif (retractionDOI.length > 0) {\n\t\t\tretractionDOI = shared.appendDOIURL(retractionDOI);\n\t\t\tcontainer2 = container2.appendData(retractionDOI, ', ');\n\t\t} else if (retractionURL.length > 0) {\n\t\t\tretractionURL = shared.formatURL(retractionURL);\n\t\t\tcontainer2 = container2.appendData(retractionURL, ', ');\n\t\t}\n\n\t\t\n\t}//e:if:reprinted\n\n\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n\n if (citationTitle.length == 0) {\n citationTitle = shared.getStringValue(refData.content);\n }\n\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = true;\n\n let type = shared.getStringValue(refData.type);\n let title = shared.getStringValue(refData.title);\n\n let ignoreFormat = false;\n if (title.length == 0) {\n titleProperty = \"content\";\n ignoreFormat = true;\n }\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle, ignoreFormat);\n \n if (type == \"comment\" || type == \"forum\") {\n if (primaryContributor.startsWith('\"')) {\n primaryContributor = 'Comment on ' + primaryContributor;\n }\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\n\t\n let title = shared.getStringValue(refData.title);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t} else {\n title = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t\ttitle = title.doubleQuote();\n\t\t}\n\t}\n\n if (title.length > 0) {\n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' Comment on ' + title;\n } else{\n primaryPart = 'Comment on ' + title;\n }\n } else {\n\t\t// no title found\n\t\tif(type === 'comment' || type === 'forum') {\n\t\t\t//content\n\t\t\tlet content = shared.getStringValue(refData.content);\n\t\t\tif (content.length > 0) {\n\n if (title.length > 0) {\n content = content.doubleQuote();\n }\n\n\t\t\t\tprimaryPart = content;\n\t\t\t}\n\t\t}\n\t}\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n\tif(type === 'forum'){\n\t\t//platform\n\t\tlet platform = shared.getStringValue(refData.platform);\n\t\tif (platform.length > 0) {\n platform = platform.replaceAmpersand();\n\t\t\tplatform = platform.toTitleCase();\n\t\t\tplatform = platform.italicize();\n\t\t\tcontainer1 = container1.appendData(platform, ', ');\n\t\t}\n\t} else if(type === 'comment'){\n\t\t// source\n\t\tlet source = shared.getStringValue(refData.source);\n\t\tif (source.length > 0) {\n source = source.replaceAmpersand();\n\t\t\tsource = source.toTitleCase();\n\t\t\tsource = source.italicize();\n\t\t\tcontainer1 = container1.appendData(source, ', ');\n\t\t}\n\t}\n\n\t//publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n\n //url\n let url = shared.getStringValue(refData.url);\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any container data needed\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n //TODO: add any supplemental data needed\n\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let title = shared.getStringValue(refData.title);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t}\n\t\telse{\n title = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t\ttitle = title.italicize();\n\t\t}\n\t}\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any first supplemental data needed\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n\t// number\n let version = shared.getStringValue(refData.number);\t\n\tcontainer1 = container1.appendData(version, ', ', 'US');\n\n\tcontainer1 = container1.appendData('U.S. Patent and Trademark Office', ', ');\n\n\t// publicationDate\n\tlet publicationDate = shared.getStringValue(refData.publicationDate);\n\tpublicationDate = shared.getYear(publicationDate);\n\tcontainer1 = container1.appendData(publicationDate, ', ');\n\n\n\n //url\n let url = shared.getStringValue(refData.url);\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any container data needed\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n //TODO: add any supplemental data needed\n\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.description);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'description';\n let isSecondaryTitle = false;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle, true);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n \n let title = shared.getStringValue(refData.description);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t} else{\n\t\t\t// title = title.toTitleCase();\n\t\t\t// title = title.italicize();\n\t\t}\n\t}\n\n if (title.length > 0) {\n\n title = title.replaceAmpersand();\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n //publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n\tcontainer2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n if (refData.type == 'episode') {\n citationTitle = shared.getStringValue(refData.episodeTitle);\n\n if (citationTitle.length == 0) {\n citationTitle = shared.getStringValue(refData.title); \n }\n }\n else{\n citationTitle = shared.getStringValue(refData.title); \n }\n\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let type = shared.getStringValue(refData.type);\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n if (type == 'episode') {\n titleProperty = 'episodeTitle';\n isSecondaryTitle = true;\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let type = shared.getStringValue(refData.type);\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n primaryPart = primaryContributor;\n\n let title = '';\n\n if (type == 'episode') {\n title = shared.getStringValue(refData.episodeTitle);\n \n if (title.length > 0) {\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.doubleQuote();\n }\n }\n }\n else{\n title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n\n if (type == \"interview\") {\n title = title.doubleQuote();\n }\n else{\n title = title.italicize();\n }\n }\n }\n }\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let secondaryContributor = shared.getSecondaryContributorString(refData.contributors);\n \n switch (type) {\n case 'series':\n //Secondary Contribs\n container1 = container1.appendData(secondaryContributor, ', ');\n\n break;\n case 'episode':\n let title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.italicize();\n }\n\n container1 = container1.appendData(title, ', ');\n }\n\n //Secondary Contribs\n container1 = container1.appendData(secondaryContributor, ', ');\n\n //episodeNumber\n let episodeNumber = shared.getStringValue(refData.episodeNumber);\n\n if (episodeNumber.length > 0) {\n //this could be an integer, or it could be \"Season 4, Episode 15\"\n //each needs to be handled differently\n\n if (shared.isInteger(episodeNumber)) {\n container1 = container1.appendData(episodeNumber, ', ', 'no.', '');\n }\n else{\n episodeNumber = episodeNumber.toLowerCase();\n container1 = container1.appendData(episodeNumber, ', ', '', '');\n }\n }\n\n break;\n case 'interview':\n //\"Container 1: archiveName, publishers, publicationDate, url.\",\n //archiveName\n let archiveName = shared.getStringValue(refData.archiveName);\n\n if (archiveName.length > 0) {\n archiveName = archiveName.italicize();\n container1 = container1.appendData(archiveName, ', ', '', '');\n }\n\n break;\n }\n\n //Publishers\n let publisherString = shared.getPublisherString(refData.publishers);\n publisherString = publisherString.split('University').join('U');\n\n if(publisherString.length > 0){\n container1 = container1.appendData(publisherString, ', ');\n }\n\n //publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n //url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type != 'interview') {\n //platform\n let platform = shared.getStringValue(refData.platform);\n if (platform.length > 0) {\n platform = platform.italicize();\n container2 = container2.appendData(platform, ', ');\n }\n }\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n let label = '';\n\n let title = shared.getStringValue(refData.title);\n let isDescription = false;\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n isDescription = true;\n }\n } \n\n if (type == 'series' && kind == 'audio') {\n label = 'Audio podcast';\n }\n\n if (type == 'series' && kind == 'video') {\n label = 'Video podcast';\n }\n\n if (type == 'series' && kind == 'radio') {\n label = 'Radio series';\n }\n\n if (type == 'episode' && kind == 'audio') {\n label = 'Audio podcast episode';\n }\n\n if (type == 'episode' && kind == 'video') {\n label = 'Video podcast episode';\n }\n\n if (type == 'episode' && kind == 'radio') {\n label = 'Radio series episode';\n }\n\n if (type == 'interview') {\n label = 'Interview';\n }\n\n //if they entered a desciption in the title, do not add the label\n if (label.length > 0 && !isDescription) {\n secondSupplemental = secondSupplemental.appendData(label, ', ');\n }\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'workTitle';\n let isSecondaryTitle = true;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\n\n let title = '';\n\n //TODO: see if there is any secondary title information used here\n // //title will not be used in this section if this is a book chapter\n // if (type == 'bookChapter') {\n // title = shared.getStringValue(refData.chapterTitle);\n \n // if (title.length > 0) {\n // title = title.toTitleCase();\n // title = title.doubleQuote();\n // }\n // }\n // else{\n title = shared.getStringValue(refData.workTitle);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n\t\t\t\ttitle = title.doubleQuote();\n }\n }\n // }\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any first supplemental data needed\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n\t// \"Container 1: Publishers, publicationDate, url / doi.\",\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n\t//Publishers\n //this type is weird and italicizes publishers\n let publisherString = shared.getPublisherString(refData.publishers, 'reference', true);\n container1 = container1.appendData(publisherString, ', ');\n\n\t//publicationDate\n\tlet publicationDate = shared.getStringValue(refData.publicationDate);\n\tpublicationDate = shared.getFullDate(publicationDate);\n\tcontainer1 = container1.appendData(publicationDate, ', ');\n\n\t// doi/url\n\tlet url = shared.getStringValue(refData.url);\n\tlet doi = shared.getStringValue(refData.doi);\n\n\tif (doi.length > 0) {\n\t\tdoi = shared.appendDOIURL(doi);\n\t\tcontainer1 = container1.appendData(doi, ', ');\n\t} else{\n\t\tif (url.length > 0) {\n\t\t\turl = shared.formatURL(url);\n\t\t\tcontainer1 = container1.appendData(url, ', ');\n\t\t}\n\t}\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any container data needed\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = 'Press release.';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n //TODO: add any supplemental data needed\n\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const _forEach = require('lodash/forEach');\nconst shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0 || kind.length == 0) {\n return 'Type and Kind required.';\n }\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n if (refData.type == 'whole') {\n citationTitle = shared.getStringValue(refData.referenceTitle);\n }\n else{\n citationTitle = shared.getStringValue(refData.entryTitle); \n }\n\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'entryTitle';\n let isSecondaryTitle = true;\n\n let type = shared.getStringValue(refData.type);\n\n if (type == 'whole') {\n titleProperty = 'referenceTitle';\n isSecondaryTitle = false;\n }\n\n let primaryContributor;\n let editorsOnly = hasEditorsOnly(refData.contributors);\n\n if (editorsOnly && type == 'entry') {\n let fakeRefData = new Object();\n\t\tfakeRefData.entryTitle = refData.entryTitle;\n fakeRefData.referenceTitle = refData.referenceTitle;\n\t\tfakeRefData.contributors = []; //contribs arent listed in the citation here\n \n primaryContributor = shared.getPrimaryContributorCitationString(fakeRefData, titleProperty, isSecondaryTitle);\n }\n else{\n primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //for this type, no contributors are primary..editors are always secondary\n let editorsOnly = hasEditorsOnly(refData.contributors);\n\n if (editorsOnly && type == 'entry') {\n primaryContributor = '';\n }\n else{\n primaryContributor = shared.getPrimaryContributorString(refData);\n }\n\n primaryPart = primaryContributor;\n\n let title = '';\n\n if (type == 'whole') {\n title = shared.getStringValue(refData.referenceTitle);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.italicize();\n }\n }\n }\n else{\n title = shared.getStringValue(refData.entryTitle);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.doubleQuote();\n }\n }\n }\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let referenceTitle = shared.getStringValue(refData.referenceTitle);\n\n if (referenceTitle.length > 0) {\n referenceTitle = referenceTitle.replaceAmpersand();\n referenceTitle = referenceTitle.toTitleCase();\n referenceTitle = referenceTitle.italicize();\n }\n\n let secondaryContributor;\n\n if (type == 'entry') {\n secondaryContributor = getSecondaryContributorString(refData.contributors); \n }\n else{\n secondaryContributor = shared.getSecondaryContributorString(refData.contributors);\n }\n\n let publishers = shared.getPublisherString(refData.publishers);\n\n let edition = shared.getStringValue(refData.edition);\n\tedition = shared.fixEditionString(edition);\n \n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n publicationDate = shared.formatOriginalPublicationDate(publicationDate);\n\n let pageNumbers = shared.getStringValue(refData.pageNumber);\n pageNumbers = shared.formatPageNumbers(pageNumbers);\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n }\n }\n\n switch (type) {\n case 'entry':\n\n switch (kind) {\n case 'encyclopedia':\n //referenceTitle, secondary contributors, edition, publishers, publicationDate, pageNumber, url / doi.\n container1 = container1.appendData(referenceTitle, '');\n container1 = container1.appendData(secondaryContributor, ', ');\n container1 = container1.appendData(edition, ', ');\n container1 = container1.appendData(publishers, ', ');\n container1 = container1.appendData(publicationDate, ', ');\n container1 = container1.appendData(pageNumbers, ', ');\n\n if (doi.length > 0) {\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n container1 = container1.appendData(url, ', ');\n }\n }\n\n break;\n case 'wikipedia':\n //'Wikipedia,', secondary contributors, publicationDate, url.\n container1 = container1.appendData('Wikipedia', '');\n container1 = container1.appendData(secondaryContributor, ', ');\n container1 = container1.appendData(publicationDate, ', ');\n container1 = container1.appendData(url, ', ');\n break;\n }\n \n break;\n\n case 'whole':\n //Secondary contributors, edition, publishers, publicationDate, url / doi. \n container1 = container1.appendData(secondaryContributor, '');\n container1 = container1.appendData(edition, ', ');\n container1 = container1.appendData(publishers, ', ');\n container1 = container1.appendData(publicationDate, ', ');\n\n if (doi.length > 0) {\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n container1 = container1.appendData(url, ', ');\n }\n }\n\n break;\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publishers == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publishers)) {\n container1 = container1.upperFirstLetter();\n }\n }\n\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n //retrievalDate\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n retrievalDate = shared.getFullDate(retrievalDate);\n secondSupplemental = secondSupplemental.appendData(retrievalDate, ', ', 'accessed', '');\n\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}\n\n//doing this as a one off since this is where all contributors go for this type\nfunction getSecondaryContributorString(contributors){\n\n let contributorstring = '';\n\n if (typeof contributors === 'undefined') {\n return contributorstring;\n }\n\n if (contributors.length > 0) {\n //for these contributors, get them all - which is editors and tranlators\n let secondaryContributors = contributors; \n \n if (secondaryContributors.length > 0) {\n\n let typeStrings = [];\n\n let editors = shared.getContributorsByType('editor', secondaryContributors);\n let translators = shared.getContributorsByType('translator', secondaryContributors);\n\n if (editors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(editors, 'editor'));\n }\n\n if (translators.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(translators, 'translator'));\n }\n\n\n typeStrings.forEach(typeString => {\n if (contributorstring.length > 0) {\n contributorstring = contributorstring + \", \"\n }\n\n contributorstring = contributorstring + typeString;\n });\n }\n\n }\n\n return contributorstring;\n}\n\nfunction hasEditorsOnly(contributors){\n let editorOnly = false;\n\n if (typeof contributors == 'undefined'){\n return editorOnly;\n }\n\n if (contributors.length > 0) {\n \n if (contributors[0].type == 'editor') {\n \n editorOnly = true;\n \n\t\t\t_forEach(contributors, (contrib) => {\n if (contrib.type != 'editor') {\n editorOnly = true;\n }\n });\n }\n }\n\n return editorOnly;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0 || kind.length == 0) {\n return 'Type and Kind required.';\n }\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = 'United States';\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryContributor = 'United States';\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n \n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n let primaryPart = '';\n\n switch (type) {\n case 'report':\n\n if (kind == 'senate') {\n primaryPart = 'United States, Congress, Senate';\n }\n\n if (kind == 'house') {\n primaryPart = 'United States, Congress, House';\n }\n \n break;\n case 'regulation':\n primaryPart = 'United States';\n break;\n }\n\n let groupAuthor = shared.getPrimaryContributorString(refData);\n primaryPart = primaryPart.appendData(groupAuthor, ', ');\n \n\n let title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n title = title.replaceAmpersand();\n \n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.toTitleCase();\n\n switch (type) {\n case 'report':\n title = title.italicize();\n break;\n case 'regulation':\n title = title.doubleQuote();\n break;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n primaryPart = primaryPart.appendData(title, ' ');\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n \n switch (type) {\n case 'report':\n\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n break;\n case 'regulation':\n \n switch (kind) {\n case 'codified':\n container1 = container1.appendData('Code of Federal Regulations', ', ');\n\n //volume\n let volume = shared.getStringValue(refData.volume);\n container1 = container1.appendData(volume, ', ', 'vol.', '');\n\n container1 = container1.appendData('Government Publishing Office', ', ');\n\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n let section = shared.getStringValue(refData.section);\n container1 = container1.appendData(section, ', ', 'sec.', );\n\n break;\n case 'uncodified':\n container1 = container1.appendData('Office of the Federal Register', ', ');\n\n let proposedVolume = shared.getStringValue(refData.proposedVolume);\n container1 = container1.appendData(proposedVolume, ', ', 'vol.', '');\n\n container1 = container1.appendData('Government Publishing Office', ', ');\n\n //proposedDate\n let proposedDate = shared.getStringValue(refData.proposedDate);\n proposedDate = shared.getFullDate(proposedDate);\n container1 = container1.appendData(proposedDate, ', ');\n\n //pageNumber\n let pageNumber = shared.getStringValue(refData.pageNumber);\n pageNumber = shared.formatPageNumbers(pageNumber);\n container1 = container1.appendData(pageNumber, ', ');\n\n break;\n }\n \n break;\n }\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let session = shared.getStringValue(refData.session);\n\n if (session.length > 0) {\n session = shared.getOrdinalValue(session);\n container2 = container2.appendData(session, ', ', '', 'Congress');\n }\n\n switch (kind) {\n case 'senate':\n container2 = container2.appendData('Senate Report', ', ');\n break;\n case 'house':\n container2 = container2.appendData('House Report', ', ');\n break;\n }\n\n let reportNumber = shared.getStringValue(refData.reportNumber);\n container2 = container2.appendData(reportNumber, ' ', '', '');\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.bookTitle);\n\n if (citationTitle.length == 0) {\n citationTitle = shared.getStringValue(refData.translatedTitle);\n }\n\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.originalPublicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'bookTitle';\n let isSecondaryTitle = false;\n\n let title = shared.getStringValue(refData.bookTitle);\n\n if (title.length == 0) {\n titleProperty = 'translatedTitle';\n isSecondaryTitle = false;\n }\n\n //make a copy of refdata to pass off to the shared code\n let fakeRefDate = new Object();\n fakeRefDate.bookTitle = refData.bookTitle;\n fakeRefDate.translatedTitle = refData.translatedTitle;\n fakeRefDate.contributors = []; //contribs arent listed in the citation here\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(fakeRefDate, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let type = shared.getStringValue(refData.type);\n\n let title = shared.getStringValue(refData.bookTitle);\n\n \n \n \n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.italicize();\n }\n\n } else {\n // title is blank, try to grab the translatedTitle to use in it's place\n title = shared.getStringValue(refData.translatedTitle);\n if(title){\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n\n // title = title.toTitleCase();\n title = title.italicize();\n }\n }\n \n }\n\n if (title.length > 0) {\n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n } else{\n primaryPart = title;\n }\n }\n \n primaryPart = shared.fixClosure(primaryPart);\n\n\n let version = shared.getStringValue(refData.version);\n primaryPart = primaryPart.appendData(version);\n\n \n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //originalPublicationDate \n\tlet originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n originalPublicationDate = shared.getFullDate(originalPublicationDate);\n originalPublicationDate = shared.formatOriginalPublicationDate(originalPublicationDate);\n\tfirstSupplemental = firstSupplemental.appendData(originalPublicationDate, ', ');\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //All Contribs\n let allContribs = getSecondaryContributorString(refData.contributors);\n container1 = container1.appendData(allContribs, ', ');\n\n //edition\n\tlet edition = shared.getStringValue(refData.edition);\n\tedition = shared.fixEditionString(edition);\n\tcontainer1 = container1.appendData(edition, ', ');\n \n\t//Publishers\n\tlet publisherString = shared.getPublisherString(refData.publishers);\n\tcontainer1 = container1.appendData(publisherString, ', ');\n\n\t//publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n publicationDate = shared.formatOriginalPublicationDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n\t// doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n } else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n \n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}\n\n//doing this as a one off since this is where all contributors go for this type\nfunction getSecondaryContributorString(contributors){\n\n let contributorstring = '';\n\n if (typeof contributors === 'undefined') {\n return contributorstring;\n }\n\n if (contributors.length > 0) {\n //for these contributors, get them all - which is editors and tranlators\n let secondaryContributors = contributors; \n \n if (secondaryContributors.length > 0) {\n\n let typeStrings = [];\n\n let editors = shared.getContributorsByType('editor', secondaryContributors);\n let translators = shared.getContributorsByType('translator', secondaryContributors);\n\n if (editors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(editors, 'editor'));\n }\n\n if (translators.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(translators, 'translator'));\n }\n\n\n typeStrings.forEach(typeString => {\n if (contributorstring.length > 0) {\n contributorstring = contributorstring + \", \"\n }\n\n contributorstring = contributorstring + typeString;\n });\n }\n\n }\n\n return contributorstring;\n}","const _forEach = require('lodash/forEach');\nconst shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type.length == 0 || kind.length == 0) {\n return 'Type and Kind required.';\n }\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n let authors = shared.getContributorsByType('author', refData.contributors);\n let fakeRefData = new Object();\n fakeRefData.contributors = authors;\n fakeRefData.title = refData.title;\n\n let kind = shared.getStringValue(refData.kind);\n if (kind == 'song' || kind == 'tvEpisode') {\n isSecondaryTitle = true;\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(fakeRefData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n //for this type, only authors are primary, so filter those out\n let authors = shared.getContributorsByType('author', refData.contributors);\n let fakeRefData = new Object();\n fakeRefData.contributors = authors;\n\n let primaryContributor = shared.getPrimaryContributorString(fakeRefData);\n primaryPart = primaryContributor;\n\n let title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.doubleQuote();\n }\n\n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let reviewedTitle = shared.getStringValue(refData.reviewedTitle);\n \n if (reviewedTitle.length > 0) {\n if (reviewedTitle.startsWith('[')) {\n reviewedTitle = shared.removeDescriptionFromTitle(reviewedTitle);\n }\n else{\n reviewedTitle = reviewedTitle.replaceAmpersand();\n reviewedTitle = reviewedTitle.toTitleCase();\n\n if (!reviewedTitle.endsWith('\"')) {\n if (kind == 'song' || kind == 'tvEpisode') {\n reviewedTitle = reviewedTitle.doubleQuote();\n }\n else {\n reviewedTitle = reviewedTitle.italicize();\n }\n }\n }\n\n firstSupplemental = firstSupplemental.appendData(reviewedTitle, ', ');\n }\n\n //Secondary Contribs\n let secondaryContributor = getSecondaryContributorString(refData.contributors);\n firstSupplemental = firstSupplemental.appendData(secondaryContributor, ', ');\n\n if (firstSupplemental.length > 0) {\n firstSupplemental = 'Review of ' + firstSupplemental;\n }\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let publicationDate = shared.getFullDate(refData.publicationDate);\n let url = shared.getStringValue(refData.url);\n\n switch (type) {\n case 'periodical':\n //[periodical], vol. [volume], no. [issue], [publicationDate], [pageNumbers], [url/doi].\n let periodical = shared.getStringValue(refData.periodical);\n\n if (periodical.length > 0) {\n periodical = periodical.replaceAmpersand();\n periodical = periodical.toTitleCase();\n periodical = periodical.italicize();\n\n container1 = container1.appendData(periodical, ', ');\n }\n\n //volume\n let volume = shared.getStringValue(refData.volume);\n container1 = container1.appendData(volume, ', ', 'vol.', '');\n\n //issue\n let issue = shared.getStringValue(refData.issue);\n container1 = container1.appendData(issue, ', ', 'no.', '');\n\n //publicationDate\n container1 = container1.appendData(publicationDate, ', ');\n\n //pageNumbers\n let pageNumbers = shared.getStringValue(refData.pageNumbers);\n pageNumbers = shared.formatPageNumbers(pageNumbers);\n container1 = container1.appendData(pageNumbers, ', ');\n\n // doi/url\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n break;\n case \"website\":\n //[website], [publicationDate], [url].\n let website = shared.getStringValue(refData.website);\n\n if (website.length > 0) {\n website = website.replaceAmpersand();\n website = website.toTitleCase();\n website = website.italicize();\n\n container1 = container1.appendData(website, ', ');\n }\n\n //publicationDate\n container1 = container1.appendData(publicationDate, ', ');\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n\n break;\n case \"blog\":\n //[blog], [publicationDate], [url].\n let blog = shared.getStringValue(refData.blog);\n\n if (blog.length > 0) {\n blog = blog.replaceAmpersand();\n blog = blog.toTitleCase();\n blog = blog.italicize();\n\n container1 = container1.appendData(blog, ', ');\n }\n\n //publicationDate\n container1 = container1.appendData(publicationDate, ', ');\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n\n break;\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}\n\n//doing this as a one off since this is where all contributors go for this type\nfunction getSecondaryContributorString(contributors){\n\n let contributorstring = '';\n\n if (typeof contributors === 'undefined') {\n return contributorstring;\n }\n\n if (contributors.length > 0) {\n //for these contributors, get them all - which is editors and tranlators\n let secondaryContributors = contributors; \n \n if (secondaryContributors.length > 0) {\n\n let typeStrings = [];\n\n let reviewAuthors = shared.getContributorsByType('reviewAuthor', secondaryContributors);\n let reviewEditors = shared.getContributorsByType('reviewEditor', secondaryContributors);\n let directors = shared.getContributorsByType('reviewDirector', contributors);\n let writers = shared.getContributorsByType('reviewWriter', contributors);\n let writerDirectors = shared.getContributorsByType('reviewWriterDirector', contributors);\n let artists = shared.getContributorsByType('reviewArtist', contributors);\n let reviewComposers = shared.getContributorsByType('reviewComposer', contributors);\n let reviewGroupArtists = shared.getContributorsByType('reviewGroupArtist', contributors);\n\n if (writerDirectors.length > 0) {\n if (directors.length > 0 || writers.length > 0) {\n \n //we need to get order they were entered correctly, so let's recreate these arrays as listed\n directors = [];\n writers = [];\n writerDirectors = [];\n\n\t\t\t\t\t_forEach(contributors, (contributor) => {\n switch (contributor.type) {\n case 'reviewDirector':\n directors.push(contributor);\n break;\n case 'reviewWriter':\n writers.push(contributor);\n break;\n case 'reviewWriterDirector':\n directors.push(contributor);\n writers.push(contributor);\n break;\n }\n });\n }\n }\n\n if (reviewAuthors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(reviewAuthors, 'reviewAuthor'));\n }\n\n if (reviewEditors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(reviewEditors, 'editor'));\n }\n\n //directors\n if (directors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(directors, 'director'));\n }\n\n //writers\n if (writers.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(writers, 'writer'));\n }\n\n //writerDirectors\n if (writerDirectors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(writerDirectors, 'writerDirector'));\n }\n\n //artists\n if (artists.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(artists, 'reviewArtist'));\n }\n\n //reviewGroupArtists\n if (reviewGroupArtists.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(reviewGroupArtists, 'reviewGroupArtist'));\n }\n\n //reviewComposers\n if (reviewComposers.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(reviewComposers, 'reviewComposer'));\n }\n\n typeStrings.forEach(typeString => {\n if (contributorstring.length > 0) {\n contributorstring = contributorstring + \", \"\n }\n\n contributorstring = contributorstring + typeString;\n });\n }\n\n }\n\n return contributorstring;\n}","const _forEach = require('lodash/forEach');\nconst dateHelper = require('../dateHelper');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getOrderByValue,\n getStringValue,\n getPrimaryContributorString,\n getPrimaryContributorSort,\n getPrimaryCustomContributorString,\n getPrimaryContributorCitationString,\n getSecondaryContributorString,\n getFirstSupplementalContributorString,\n getContributorsByType,\n getSecondaryContributorTypeString,\n fixClosure,\n appendDOIURL,\n getYear,\n getMonthYear,\n getFullDate,\n getFullDateRange,\n formatOriginalPublicationDate,\n formatURL,\n getPublisherString,\n getCitations,\n fixEditionString,\n fixFormatString,\n isInteger,\n removeDescriptionFromTitle,\n formatPageNumbers,\n abbreviate,\n ordinalToWord,\n getOrdinalValue,\n getSecondaryReferenceName,\n usePluralLabel\n}\n\nfunction getOrderByValue(reference){\n\n let referenceValue = reference.displayValue;\n\n if (referenceValue == '') {\n return '';\n }\n\n let orderByValue = referenceValue;\n \n if (typeof reference.authorPartSort !== 'undefined') {\n let authorPartSort = reference.authorPartSort;\n\n orderByValue = orderByValue.replace(reference.authorPart, authorPartSort);\n }\n\n //before we remove any tags, replace anything within italics and is a number with text\n //22 searches for Sasquatch\n //twenty two searches for Sasquatch\n\n var words = orderByValue.split(\" \");\n let inItalics = false;\n for (var i = 0; i < words.length; i += 1) {\n if (words[i].startsWith('')) {\n inItalics = true;\n words[i] = words[i].replace('', '');\n }\n\n if (inItalics) {\n words[i] = words[i].replace(':', '');\n }\n\n if (words[i].endsWith('') || words[i].endsWith('.')) {\n inItalics = false;\n words[i] = words[i].replace('.', '');\n words[i] = words[i].replace('', '');\n }\n\n if (words[i].endsWith('.')) {\n words[i] = words[i].removeLastCharacter();\n }\n\n if (words[i].endsWith('.\"')) {\n words[i] = words[i].removeLastCharacter();\n words[i] = words[i].removeLastCharacter();\n }\n\n words[i] = convertNumberToText(words[i]);\n }\n\n orderByValue = words.join(' ');\n\n //now split back out and remove anything in brackets (like user names)\n words = orderByValue.split(\" \");\n let bracketlessArray = [];\n let inBrackets = false;\n\n for (var i = 0; i < words.length; i += 1) {\n\n if (i > 0) {\n if (words[i].startsWith('[')) {\n inBrackets = true;\n } \n }\n \n if (inBrackets === false) {\n bracketlessArray.push(words[i]);\n }\n\n if (i > 0) {\n if (words[i].endsWith(']') || words[i].endsWith('].')) {\n inBrackets = false;\n }\n }\n }\n\n orderByValue = bracketlessArray.join(' ');\n\n orderByValue = removeTags(orderByValue);\n\n //we need to parse the date from the value and convert it to sortable\n //IE: 2020, March 15 to 2020 03 15\n var array = orderByValue.split(\".\");\n\n for (i = 0; i < array.length; i++) {\n\n if (array[i].startsWith(' (') && array[i].endsWith(')')) {\n array[i] = array[i].split(\"(\").join(\"\");\n array[i] = array[i].split(\")\").join(\"\");\n\n //if the array is just a year, then append 00 00\n if (array[i].length == 5) {\n if (isInteger(array[i])) {\n array[i] = array[i] + ' 00 00';\n }\n }\n\n //if this section has a month only, we need to add a 00 for the sort after ut\n if (array[i].endsWith('January') || array[i].endsWith('February') || array[i].endsWith('March') ||\n array[i].endsWith('April') || array[i].endsWith('May') || array[i].endsWith('June') || \n array[i].endsWith('July') || array[i].endsWith('August') || array[i].endsWith('September') || \n array[i].endsWith('October') || array[i].endsWith('November') || array[i].endsWith('December')) {\n array[i] = array[i] + ' 00';\n }\n\n //replace any months with digits for sorting\n array[i] = array[i].replace('January', '01');\n array[i] = array[i].replace('February', '02');\n array[i] = array[i].replace('March', '03');\n array[i] = array[i].replace('April', '04');\n array[i] = array[i].replace('May', '05');\n array[i] = array[i].replace('June', '06');\n array[i] = array[i].replace('July', '07');\n array[i] = array[i].replace('August', '08');\n array[i] = array[i].replace('September', '09');\n array[i] = array[i].replace('October', '10');\n array[i] = array[i].replace('November', '11');\n array[i] = array[i].replace('December', '12');\n }\n\n }\n\n orderByValue = array.join('.');\n orderByValue = orderByValue.split(\". \").join(\" \");\n\n orderByValue = orderByValue.trim();\n\n if (orderByValue.endsWith('.')) {\n orderByValue = orderByValue.substring(0, orderByValue.length - 1);\n }\n\n if (orderByValue.endsWith(' point')) {\n orderByValue = orderByValue.substring(0, orderByValue.length - 6);\n }\n\n orderByValue = orderByValue.split(\"(enacted)\").join(\"\");\n orderByValue = orderByValue.split(\"(Reprinted from\").join(\"\");\n orderByValue = orderByValue.split(\"(Director)\").join(\"\");\n orderByValue = orderByValue.split(\"(Original work published \").join(\"\");\n orderByValue = orderByValue.split(\"(Retraction published \").join(\"\");\n orderByValue = orderByValue.split(\"(Host)\").join(\"\");\n orderByValue = orderByValue.split(\"(Hosts)\").join(\"\");\n orderByValue = orderByValue.split(\"(Executive Producer)\").join(\"\");\n orderByValue = orderByValue.split(\"(Executive Producers)\").join(\"\");\n orderByValue = orderByValue.split(\"(Ed.)\").join(\"\");\n orderByValue = orderByValue.split(\"(Eds.)\").join(\"\");\n orderByValue = orderByValue.split(\"Ed. & Trans.\").join(\"\");\n orderByValue = orderByValue.split(\", Trans.\").join(\" \");\n\n orderByValue = orderByValue.split(\".,\").join(\"\");\n orderByValue = orderByValue.split(\",\").join(\"\");\n orderByValue = orderByValue.split(\"[\").join(\"\");\n orderByValue = orderByValue.split(\"]\").join(\"\");\n orderByValue = orderByValue.split(\"(\").join(\" \");\n orderByValue = orderByValue.split(\")\").join(\" \");\n orderByValue = orderByValue.split(String.fromCharCode(34)).join(\"\"); //double quotes\n orderByValue = orderByValue.split(\"“\").join(\"\");\n orderByValue = orderByValue.split(\"”\").join(\"\");\n orderByValue = orderByValue.split(\"”\").join(\"\");\n orderByValue = orderByValue.split(\": \").join(\" \");\n orderByValue = orderByValue.split(\" n.d. \").join(\" 0000 \");\n orderByValue = orderByValue.split(\" n.d.-\").join(\" 0000\");\n orderByValue = orderByValue.split(\" in press \").join(\" 9999 \");\n orderByValue = orderByValue.split(\" in press-\").join(\" 9999\");\n orderByValue = orderByValue.split(\" \").join(\" \");\n orderByValue = orderByValue.split(\". & \").join(\" \");\n orderByValue = orderByValue.split(\" & \").join(\" \");\n orderByValue = orderByValue.split(\" + \").join(\" plus \");\n orderByValue = orderByValue.split(\" - \").join(\" minus \");\n orderByValue = orderByValue.split(\" = \").join(\" equals \");\n\n //replace special characters with their equivalent values\n orderByValue = orderByValue.split(\"é\").join(\"e\");\n orderByValue = orderByValue.split(\"á\").join(\"a\");\n orderByValue = orderByValue.split(\"ú\").join(\"u\");\n orderByValue = orderByValue.split(\"í\").join(\"i\");\n orderByValue = orderByValue.split(\"ó\").join(\"o\");\n orderByValue = orderByValue.split(\"ñ\").join(\"n\");\n orderByValue = orderByValue.split(\"ü\").join(\"u\");\n orderByValue = orderByValue.split(\"ö\").join(\"o\");\n orderByValue = orderByValue.split(\"ä\").join(\"a\");\n orderByValue = orderByValue.split(\"ç\").join(\"c\");\n \n orderByValue = orderByValue.toLowerCase();\n orderByValue = orderByValue.trim();\n\n\treturn orderByValue;\n}\n\nfunction convertNumberToText (num) {\n\n var th = ['','thousand','million', 'billion','trillion'];\n var dg = ['zero','one','two','three','four', 'five','six','seven','eight','nine'];\n var tn = ['ten','eleven','twelve','thirteen', 'fourteen','fifteen','sixteen', 'seventeen','eighteen','nineteen'];\n var tw = ['twenty','thirty','forty','fifty', 'sixty','seventy','eighty','ninety'];\n\n num = num.toString();\n num = num.replace(/[\\, ]/g,'');\n if (num != parseFloat(num)) return num;\n var x = num.indexOf('.');\n \n if (x == -1)\n x = num.length;\n \n if (x > 15)\n return num;\n\n var n = num.split(''); \n var str = '';\n var sk = 0;\n for (var i=0; i < x; i++) {\n if ((x-i)%3==2) { \n if (n[i] == '1') {\n str += tn[Number(n[i+1])] + ' ';\n i++;\n sk=1;\n } else if (n[i]!=0) {\n str += tw[num[i]-2] + ' ';\n sk=1;\n }\n } else if (n[i]!=0) { // 0235\n str += dg[n[i]] +' ';\n if ((x-i)%3==0) str += 'hundred ';\n sk=1;\n }\n if ((x-i)%3==1) {\n if (sk)\n str += th[(x-i-1)/3] + ' ';\n sk=0;\n }\n }\n\n if (x != num.length) {\n var y = num.length;\n str += 'point ';\n for (var i=x+1; i]+)>)/ig, '');\n}\n\nfunction getStringValue(input){\n var output = '';\n\n //helper to check for mull values\n if (typeof input !== 'undefined'){\n output = input.trim();\n }\n \n return output;\n}\n\nfunction getPrimaryContributorString(refData, excludeRole, primaryOverride){\n let contributorstring = '';\n\n if (typeof refData.contributors === 'undefined') {\n return contributorstring;\n }\n\n if (typeof excludeRole === 'undefined') {\n excludeRole = false;\n }\n\n if (typeof primaryOverride === 'undefined') {\n primaryOverride = '';\n }\n\n let contributors = refData.contributors;\n\n contributors = removeEmptyContributors(contributors);\n\n if (contributors.length > 0) {\n\n //determine the type of the first listed contributor\n //then grab all of that type\n\n let primaryType = getPrimaryContributorType(refData);\n\n if (primaryOverride.length > 0) {\n primaryType = primaryOverride;\n }\n\n let pluralLabel = false;\n let primaryContributors = getContributorsByType(primaryType, contributors);\n \n //1 - Last, First Middle Suffix.\n if (primaryContributors.length == 1) {\n contributorstring = getReferenceName(primaryContributors[0]);\n } \n\n\n //2 - Last, First Middle Suffix., and First Middle Last Suffix.\n if (primaryContributors.length == 2) {\n\n //if the first entry is a group author a comma is not needed, otherwise it is\n if (primaryType == 'groupAuthor') {\n contributorstring = getReferenceName(primaryContributors[0]) + ' and ' + getSecondaryReferenceName(primaryContributors[1]);\n }\n else{\n contributorstring = getReferenceName(primaryContributors[0]) + ', and ' + getSecondaryReferenceName(primaryContributors[1]);\n }\n\n pluralLabel = true;\n } \n \n //3 or more - Last, First Middle Suffix, et al. \n if (primaryContributors.length > 2) {\n\n //if the first entry is a group author a comma is not needed, otherwise it is\n if (primaryType == 'groupAuthor') {\n contributorstring = getReferenceName(primaryContributors[0]) + ' et al.';\n }\n else{\n contributorstring = getReferenceName(primaryContributors[0]) + ', et al.';\n }\n\n pluralLabel = true;\n }\n\n let contributorLabel = '';\n\n //if our primary is something other than an author...label it\n if (primaryType != 'author') {\n switch (primaryType) {\n case \"editor\":\n \n if (pluralLabel) {\n contributorLabel = 'editors';\n }\n else{\n contributorLabel = 'editor';\n }\n \n break;\n case \"translator\":\n \n if (pluralLabel) {\n contributorLabel = 'translators';\n }\n else{\n contributorLabel = 'translator';\n }\n\n break;\n case \"illustrator\":\n \n if (pluralLabel) {\n contributorLabel = 'illustrators';\n }\n else{\n contributorLabel = 'illustrator';\n }\n\n break;\n case \"narrator\":\n\n if (pluralLabel) {\n contributorLabel = 'narrators';\n }\n else{\n contributorLabel = 'narrator';\n }\n \n break;\n case \"performer\":\n case \"groupPerformer\":\n if (pluralLabel) {\n contributorLabel = 'performers';\n }\n else{\n contributorLabel = 'performer';\n }\n \n break;\n case \"host\":\n if (pluralLabel) {\n contributorLabel = 'hosts';\n }\n else{\n contributorLabel = 'host';\n }\n \n break;\n } \n }\n\n if (contributorLabel.length > 0 && !excludeRole) {\n contributorstring = contributorstring + ', ' + contributorLabel;\n }\n }\n\n //if the contributors are the same as the publisher, then MLA will add this in the secondary\n let publisherString = getPublisherString(refData.publishers);\n\n if ((contributorstring.length > 0 && publisherString == contributorstring) ||\n (contributorstring.length > 0 && publisherString + '.' == contributorstring)) {\n contributorstring = '';\n }\n\n return fixClosure(contributorstring);\n}\n\nfunction getPrimaryContributorSort(refData, excludeRole){\n let contributorstring = '';\n\n if (typeof refData.contributors === 'undefined') {\n return contributorstring;\n }\n\n if (typeof excludeRole === 'undefined') {\n excludeRole = false;\n }\n\n let contributors = refData.contributors;\n\n contributors = removeEmptyContributors(contributors);\n\n if (contributors.length > 0) {\n\n //determine the type of the first listed contributor\n //then grab all of that type\n\n let primaryType = getPrimaryContributorType(refData);\n let primaryContributors = getContributorsByType(primaryType, contributors);\n\n let counter = 0;\n _forEach(primaryContributors, (contrib) => {\n let contribString = '';\n\n // if (counter == 0) {\n contribString = getReferenceName(contrib).replace(',', '');\n // }\n // else{\n // contribString = getSecondaryReferenceName(contrib);\n // }\n \n contributorstring = contributorstring + ' ';\n contributorstring = contributorstring + contribString;\n\n counter++;\n });\n }\n\n //if the contributors are the same as the publisher, then MLA will add this in the secondary\n let publisherString = getPublisherString(refData.publishers);\n\n if ((contributorstring.length > 0 && publisherString == contributorstring) ||\n (contributorstring.length > 0 && publisherString + '.' == contributorstring)) {\n contributorstring = '';\n }\n\n return fixClosure(contributorstring);\n}\n\nfunction getPrimaryCustomContributorString(refData){\n //Film and TV have some weird but shared logic so we'll re-use this for them \n let contributorstring = '';\n\n if (typeof refData.contributors === 'undefined') {\n return contributorstring;\n }\n\n let contributors = refData.contributors;\n\n contributors = removeEmptyContributors(contributors);\n\n if (contributors.length > 0) {\n\n //primary contribs are only custom types\n let primaryContributors = getContributorsByType('custom', contributors);\n\n if (primaryContributors.length > 0) {\n switch (primaryContributors.length) {\n case 1:\n\n let label = '';\n label = getCustomContributorLabel(primaryContributors[0]);\n\n contributorstring = getReferenceName(primaryContributors[0]);\n\n if (label.length > 0) {\n contributorstring = contributorstring + ', ' + label;\n }\n break;\n \n case 2:\n \n let labelOne = '';\n let labelTwo = '';\n \n labelOne = getCustomContributorLabel(primaryContributors[0]);\n labelTwo = getCustomContributorLabel(primaryContributors[1]);\n\n contributorOnestring = getReferenceName(primaryContributors[0]);\n contributorTwostring = getReferenceName(primaryContributors[1]);\n\n if (labelOne.length > 0) {\n contributorOnestring = contributorOnestring + ', ' + labelOne;\n }\n\n if (labelTwo.length > 0) {\n contributorTwostring = contributorTwostring + ', ' + labelTwo;\n }\n\n contributorstring = contributorOnestring + ', and ' + contributorTwostring;\n break;\n\n default:\n\n let contribStringArray = [];\n\n //throw the contrib strings in an array before we build\n let counter = 1;\n\t\t\t\t\t_forEach(primaryContributors, (contrib) => {\n let contribString = '';\n \n if (counter == 1) {\n contribString = getReferenceName(contrib);\n }\n else{\n contribString = getSecondaryReferenceName(contrib);\n }\n\n let label = getCustomContributorLabel(contrib);\n\n if (label.length > 0) {\n contribString = contribString + ', ' + label;\n }\n\n contribStringArray.push(contribString);\n counter++;\n });\n\n counter = 1;\n contribStringArray.forEach(contrib => {\n if (counter > 1) {\n\n if (counter == contribStringArray.length) {\n contributorstring = contributorstring + ', and '\n }\n else{\n contributorstring = contributorstring + ', ';\n }\n }\n\n contributorstring = contributorstring + contrib;\n counter++;\n });\n\n break;\n }\n }\n }\n return fixClosure(contributorstring);\n}\n\nfunction getCustomContributorLabel(contributor){\n let label = '';\n\n if (typeof contributor === 'undefined') {\n return label;\n }\n\n if (typeof contributor.name === 'undefined') {\n return label;\n }\n\n label = contributor.name.toLowerCase();\n\n return label;\n}\n\nfunction getPrimaryContributorType(refData){\n let primaryType = '';\n\n if (typeof refData.contributors === 'undefined') {\n return primaryType;\n }\n\n let contributors =[];\n\n _forEach(refData.contributors, (item) => {\n //add any types here that cannot be a primary type\n if (item.type != 'originalEditor') {\n contributors.push(item);\n }\n });\n\n if (contributors.length > 0) {\n primaryType = getStringValue(contributors[0].type);\n }\n\n return primaryType;\n}\n\nfunction getFirstSupplementalContributorString(refData, contributorType){\n let contributorstring = '';\n\n if (typeof refData.contributors === 'undefined') {\n return contributorstring;\n }\n\n let contributors = getContributorsByType(contributorType, refData.contributors);\n\n contributors = removeEmptyContributors(contributors);\n\n if (contributors.length > 0) {\n contributorstring = getSecondaryContributorTypeString(contributors, contributorType);\n }\n\n return contributorstring;\n}\n\nfunction getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle, noTitleFormatting){\n let contributorstring = '';\n\n if (typeof refData.contributors === 'undefined') {\n refData.contributors = [];\n }\n\n //default this param to false....it's a rare case\n if (typeof noTitleFormatting === 'undefined') {\n noTitleFormatting = false;\n }\n\n let contributors = refData.contributors;\n\n contributors = removeEmptyContributors(contributors);\n\n if (typeof titleProperty === 'undefined') {\n return '';\n }\n\n if (contributors.length > 0) {\n\n //determine the type of the first listed contributor\n //then grab all of that type\n\n let primaryType = getStringValue(contributors[0].type);\n let primaryContributors = getContributorsByType(primaryType, contributors);\n\n //1 - Last, First Middle Suffix.\n if (primaryContributors.length == 1) {\n contributorstring = getCitationName(primaryContributors[0]);\n } \n\n //2 - Last, First Middle Suffix., and First Middle Last Suffix.\n if (primaryContributors.length == 2) {\n contributorstring = getCitationName(primaryContributors[0]) + ' and ' + getCitationName(primaryContributors[1]);\n } \n \n //3 or more - Last, First Middle Suffix, et al. \n if (primaryContributors.length > 2) {\n contributorstring = getCitationName(primaryContributors[0]) + ' et al.';\n }\n }\n\n //check to make sure that the publisher string is not the same as the primary contributor\n //if so, if we have a title property, we need ot use it instead\n let primaryRefString = getPrimaryContributorString(refData);\n\n if (primaryRefString.length == 0) {\n\n contributorstring = '';\n\n if (titleProperty.length > 0) {\n let title = getStringValue(refData[titleProperty]);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = removeDescriptionFromTitle(title);\n\n title = shortenGroupName(title);\n }\n else{\n title = shortenGroupName(title);\n\n if (!noTitleFormatting) {\n title = title.toTitleCase();\n\n if (!isSecondaryTitle) {\n title = title.italicize(); \n }\n else{\n title = title.doubleQuote();\n } \n }\n }\n\n contributorstring = title.replaceAmpersand();\n }\n }\n }\n \n return contributorstring;\n}\n\nfunction getSecondaryContributorString(contributors){\n\n let contributorstring = '';\n\n if (typeof contributors === 'undefined') {\n return contributorstring;\n }\n\n contributors = removeEmptyContributors(contributors);\n\n if (contributors.length > 0) {\n let primaryType = getStringValue(contributors[0].type);\n\n let secondaryContributors = [];\n \n\t\t_forEach(contributors, (item) => {\n if (item.type != primaryType) {\n\n //for authors, groupAuthors and userNames need to be filtered as well\n if (primaryType == 'author' || primaryType == 'groupAuthor' || primaryType == 'userName') {\n if (item.type != 'groupAuthor' && item.type != 'userName' && item.type != 'author') {\n secondaryContributors.push(item);\n }\n }\n else {\n secondaryContributors.push(item);\n }\n }\n });\n\n if (secondaryContributors.length > 0) {\n //pull in this order: Authors, Editors, Translators, Illustrators, Narrators\n let typeStrings = [];\n\n let authors = getContributorsByType('author', secondaryContributors);\n let editors = getContributorsByType('editor', secondaryContributors);\n let translators = getContributorsByType('translator', secondaryContributors);\n let illustrators = getContributorsByType('illustrator', secondaryContributors);\n let narrators = getContributorsByType('narrator', secondaryContributors);\n let performers = getContributorsByType('performer', secondaryContributors);\n let groupPerformers = getContributorsByType('groupPerformer', secondaryContributors);\n let executiveProducers = getContributorsByType('executiveProducer', secondaryContributors);\n let editorTranslators = getEditorTranslators(secondaryContributors);\n let testimonies = getContributorsByType('testimony', secondaryContributors);\n let volumeEditors = getContributorsByType('volumeEditor', secondaryContributors);\n \n if (editorTranslators.length > 0) {\n editors = [];\n translators = [];\n }\n\n if (authors.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(authors, 'author'));\n }\n\n if (editors.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(editors, 'editor'));\n }\n\n if (translators.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(translators, 'translator'));\n }\n\n if (illustrators.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(illustrators, 'illustrator'));\n }\n\n if (narrators.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(narrators, 'narrator'));\n }\n\n if (performers.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(performers, 'performer'));\n }\n\n if (groupPerformers.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(groupPerformers, 'groupPerformer'));\n }\n\n if (editorTranslators.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(editorTranslators, 'editorTranslator'));\n }\n\n if (executiveProducers.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(executiveProducers, 'executiveProducer'));\n }\n\n if (testimonies.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(testimonies, 'testimony'));\n }\n\n if (volumeEditors.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(volumeEditors, 'volumeEditor'));\n }\n\n //now build out our strings\n if (typeStrings.length > 0) {\n \n let counter = 0;\n typeStrings.forEach(item => {\n\n if (counter == 0) {\n //item = item.charAt(0).toUpperCase() + item.slice(1)\n \n contributorstring = item;\n }\n else{\n contributorstring = contributorstring + ', ' + item;\n }\n \n counter++;\n });\n }\n }\n\n }\n\n return contributorstring;\n}\n\nfunction getEditorTranslators(contributors){\n\n let editorTranslatorString = '';\n let editorArray = [];\n\n if (typeof contributors === 'undefined') {\n return editorArray;\n }\n\n _forEach(contributors, (item) => {\n if (item.type == 'editor') {\n editorArray.push(item);\n }\n });\n\n let translatorArray = [];\n\n _forEach(contributors, (item) => {\n if (item.type == 'translator') {\n translatorArray.push(item);\n }\n });\n\n if (editorArray.length > 0 &&\n (editorArray.length == translatorArray.length)) {\n \n let same = true;\n\n //gonna loop each array and see if we have a match\n editorArray.forEach(thisEditor =>{\n \n var found = false;\n\n translatorArray.forEach(thisTranslator =>{\n if (thisEditor.firstName == thisTranslator.firstName &&\n thisEditor.middleName == thisTranslator.middleName &&\n thisEditor.lastName == thisTranslator.lastName &&\n thisEditor.prefix == thisTranslator.prefix &&\n thisEditor.suffix == thisTranslator.suffix) {\n found = true;\n } \n });\n\n if (found == false) {\n same = false;\n }\n });\n\n if (same) {\n return translatorArray;\n }\n }\n\n return [];\n}\n\nfunction getSecondaryContributorTypeString(contributors, type){\n let contributorString = '';\n\n switch (contributors.length) {\n case 0:\n contributorString = ''\n break;\n \n case 1:\n contributorString = getSecondaryReferenceName(contributors[0]);\n break;\n\n case 2:\n contributorString = getSecondaryReferenceName(contributors[0]) + ' and ' + getSecondaryReferenceName(contributors[1]);\n break;\n\n default:\n contributorString = getSecondaryReferenceName(contributors[0]) + ' et al.';\n break;\n }\n\n if (contributorString.length > 0) {\n switch (type) {\n case \"author\":\n case \"reviewAuthor\":\n case \"reviewArtist\":\n case \"reviewGroupArtist\":\n contributorString = 'by ' + contributorString;\n break;\n case \"editor\":\n case \"originalEditor\":\n case \"volumeEditor\":\n contributorString = 'edited by ' + contributorString;\n break;\n case \"translator\":\n case \"chapterTranslator\":\n contributorString = 'translated by ' + contributorString;\n break;\n case \"illustrator\":\n contributorString = 'illustrated by ' + contributorString;\n break;\n case \"narrator\":\n contributorString = 'narrated by ' + contributorString;\n break;\n case \"testimony\":\n contributorString = 'testimony of ' + contributorString;\n break;\n case \"performer\":\n case \"groupPerformer\":\n contributorString = 'performance by ' + contributorString;\n break;\n case \"director\":\n contributorString = 'directed by ' + contributorString;\n break;\n case \"writer\":\n contributorString = 'written by ' + contributorString;\n break;\n case \"writerDirector\":\n contributorString = 'directed and written by ' + contributorString;\n break;\n case \"editorTranslator\":\n contributorString = 'edited and translated by ' + contributorString;\n break;\n case \"executiveProducer\":\n if (contributors.length == 1) {\n contributorString = contributorString + \", executive producer\";\n }\n else{\n contributorString = contributorString + \", executive producers\";\n }\n break;\n case \"chair\":\n if (contributors.length == 1) {\n contributorString = contributorString + \", chair\";\n }\n else{\n contributorString = contributorString + \", chairs\";\n }\n break;\n case \"executiveDirector\":\n if (contributors.length == 1) {\n contributorString = contributorString + \", executive director\";\n }\n else{\n contributorString = contributorString + \", executive directors\";\n }\n break;\n case \"executiveDirectorProducer\":\n \n if (contributors.length == 1) {\n contributorString = contributorString + \", executive director and executive producer\";\n }\n else{\n contributorString = contributorString + \", executive directors and executive producers\";\n }\n\n break;\n case \"reviewComposer\":\n\n let name = getStringValue(contributors[0].name);\n\n if (name.length > 0) {\n contributorString = contributorString + \", \" + name.toLowerCase();;\n }\n break;\n } \n }\n\n return contributorString;\n}\n\nfunction getReferenceName(contributor){\n var name = '';\n\n switch (contributor.type) {\n case 'author':\n case 'chapterAuthor':\n case 'custom':\n case 'executiveProducer':\n case 'executiveDirector':\n case 'executiveDirectorProducer':\n case 'director':\n case 'writer':\n case 'writerDirector':\n case 'host':\n case 'interview':\n\n case 'editor':\n case 'chapterTranslator':\n case 'translator':\n case 'narrator':\n case 'illustrator':\n case 'originalEditor':\n case 'performer':\n case 'chair':\n case 'reviewAuthor':\n case 'reviewDirector':\n case 'reviewWriter':\n case 'reviewWriterDirector':\n case 'reviewArtist':\n case 'reviewComposer':\n case 'reviewEditor':\n // Last, First Middle Suffix.\n \tif(contributor.lastName){\n\t\t\t\tif (contributor.lastName.trim().length == 0) {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tname = contributor.lastName.trim(); \n\t\t\t\t}\n\t\t\t}\n\n if (contributor.firstName && contributor.firstName.trim().length > 0) {\n name = name + ', ' + contributor.firstName;\n }\n\n\t\t\tif (contributor.middleName && contributor.middleName.trim().length > 0) {\n // name = name + ' ' + contributor.middleName;\n contributor.middleName = contributor.middleName.trim();\n\n if (name.length > 0 && contributor.firstName.trim().length == 0) {\n name = name + \",\";\n }\n\n if (contributor.middleName.includes(\" \")) {\n let middleArray = contributor.middleName.split(\" \");\n let middleNameString = \"\";\n \n for (var i = 0; i < middleArray.length; i++) {\n if (middleNameString.length > 0) {\n middleNameString = middleNameString + \" \";\n }\n\n middleNameString = middleNameString + middleArray[i];\n }\n\n name = name + ' ' + middleNameString;\n }\n else{\n name = name + ' ' + contributor.middleName;\n }\n }\n\n if (contributor.suffix && contributor.suffix.trim().length > 0) {\n\n if (contributor.suffix.toLowerCase() == 'junior') {\n contributor.suffix = 'Jr.';\n }\n\n if (contributor.suffix.toLowerCase() == 'senior') {\n contributor.suffix = 'Sr.';\n }\n\n // if (contributor.suffix.toLowerCase().startsWith('jr') ||\n // contributor.suffix.toLowerCase().startsWith('sr')) {\n \n name = name + ',';\n // }\n\n name = name + ' ' + contributor.suffix.trim();\n }\n\n if (contributor.type == 'chapterTranslator') {\n name = name + ', translator'\n }\n\n break;\n case 'userName':\n\n if(contributor.lastName){\n\t\t\t\tif (contributor.lastName.trim().length == 0) {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tname = contributor.lastName.trim(); \n\t\t\t\t}\n\t\t\t}\n\n if (contributor.firstName && contributor.firstName.trim().length > 0) {\n name = name + ', ' + contributor.firstName;\n }\n\n\t\t\tif (contributor.middleName && contributor.middleName.trim().length > 0) {\n name = name + ' ' + contributor.middleName;\n }\n\n if (contributor.suffix && contributor.suffix.trim().length > 0) {\n\n if (contributor.suffix.toLowerCase() == 'junior') {\n contributor.suffix = 'Jr.';\n }\n\n if (contributor.suffix.toLowerCase() == 'senior') {\n contributor.suffix = 'Sr.';\n }\n\n if (contributor.suffix.toLowerCase().startsWith('jr') ||\n contributor.suffix.toLowerCase().startsWith('sr')) {\n \n name = name + ',';\n }\n\n name = name + ' ' + contributor.suffix.trim();\n }\n\n let userName = '';\n \n if (contributor.name) {\n userName = contributor.name.trim();\n }\n\n if (userName.length > 0) {\n if (name.length > 0) {\n name = name + ' [' + userName + ']';\n }\n else {\n name = userName;\n }\n }\n break;\n case 'groupAuthor':\n case 'reviewGroupArtist':\n case 'groupPerformer':\n if(contributor.groupName){\n\t\t\t\tname = contributor.groupName.trim();\n }\n \n let contributorname = getStringValue(contributor.name);\n \n if (contributorname.length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n\n name = name + '[' + contributorname + ']';\n }\n\n break;\n case 'testimony':\n \n if(contributor.firstName){\n name = contributor.firstName.trim();\n }\n\n if(contributor.lastName){\n\n if (contributor.lastName.trim().length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n \n name = name + contributor.lastName.trim(); \n }\n }\n\n break;\n }\n\n return name;\n}\n\nfunction getCitationName(contributor){\n var name = '';\n\n switch (contributor.type) {\n case 'author':\n case 'chapterAuthor':\n case 'custom':\n case 'executiveProducer':\n case 'executiveDirector':\n case 'executiveDirectorProducer':\n case 'director':\n case 'writer':\n case 'writerDirector':\n case 'host':\n case 'interview':\n \tif(contributor.lastName){\n\t\t\t\tif (contributor.lastName.trim().length == 0) {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tname = contributor.lastName.trim(); \n\t\t\t\t}\n\t\t\t}\n\n break;\n case 'editor':\n case 'chapterTranslator':\n case 'translator':\n case 'narrator':\n case 'illustrator':\n case 'originalEditor':\n case 'performer':\n case 'chair':\n case 'reviewAuthor':\n case 'reviewDirector':\n case 'reviewWriter':\n case 'reviewWriterDirector':\n case 'reviewArtist':\n case 'reviewComposer':\n case 'reviewEditor':\n \n if (contributor.lastName && contributor.lastName.trim().length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n \n name = name + contributor.lastName.trim();\n }\n\n // var suffix = '';\n // if (contributor.suffix && contributor.suffix.trim().length > 0) {\n // suffix = contributor.suffix.trim();\n // }\n\n // if (suffix.length > 0) {\n // name = name + ' ' + suffix;\n\n // if (!name.endsWith(\".\")) {\n // name = name + '.'\n // }\n // }\n\n if (contributor.type == 'reviewEditor') {\n name = name + ', Ed.'\n }\n\n break;\n case 'userName':\n\n if(contributor.lastName){\n\t\t\t\tif (contributor.lastName.trim().length == 0) {\n\t\t\t\t\tname = '';\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tname = contributor.lastName.trim(); \n\t\t\t\t}\n\t\t\t}\n \n let userName = '';\n //if we dont have a last name, check user name\n if (contributor.name && name.length == 0) {\n return contributor.name.trim();\n }\n \n break;\n case 'groupAuthor':\n case 'reviewGroupArtist':\n case 'groupPerformer':\n \n if(contributor.groupName){\n\t\t\t\tname = contributor.groupName.trim();\n \n //since this is a group author, shorten\n name = shortenGroupName(name);\n }\n \n // let contributorname = getStringValue(contributor.name);\n \n // if (contributorname.length > 0) {\n // if (name.length > 0) {\n // name = name + ' ';\n // }\n\n // name = name + '[' + contributorname + ']';\n // }\n\n break;\n case 'testimony':\n \n if(contributor.firstName){\n name = contributor.firstName.trim();\n }\n\n if(contributor.lastName){\n\n if (contributor.lastName.trim().length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n \n name = name + contributor.lastName.trim(); \n }\n }\n\n break;\n }\n\n return name;\n}\n\nfunction shortenGroupName(name){\n //if we contain preposition, cut before it\n //otherwise, 3 words...break\n\n let prepositions = ['aboard'\n ,'about'\n ,'above'\n ,'across'\n ,'after'\n ,'against'\n ,'along'\n ,'amid'\n ,'among'\n ,'anti'\n ,'around'\n ,'as'\n ,'at'\n ,'before'\n ,'behind'\n ,'below'\n ,'beneath'\n ,'beside'\n ,'besides'\n ,'between'\n ,'beyond'\n ,'but'\n ,'by'\n ,'concerning'\n ,'considering'\n ,'despite'\n ,'down'\n ,'during'\n ,'except'\n ,'excepting'\n ,'excluding'\n ,'following'\n ,'for'\n ,'from'\n ,'in'\n ,'inside'\n ,'into'\n ,'like'\n ,'minus'\n ,'near'\n ,'of'\n ,'off'\n ,'on'\n ,'onto'\n ,'opposite'\n ,'outside'\n ,'over'\n ,'past'\n ,'per'\n ,'plus'\n ,'regarding'\n ,'round'\n ,'save'\n ,'since'\n ,'than'\n ,'through'\n ,'to'\n ,'toward'\n ,'towards'\n ,'under'\n ,'underneath'\n ,'unlike'\n ,'until'\n ,'up'\n ,'upon'\n ,'versus'\n ,'via'\n ,'with'\n ,'within'\n ,'without','and', 'or', 'but', '&', 'how', 'do', 'that', 'is'\n ];\n\n //if this is a subtitle, only take the first entry before the :\n if (name.includes(':')) {\n let subtitleArray = name.split(':');\n name = subtitleArray[0].trim();\n }\n\n //same with: Depression (Major Depressive Disorder)\n if (name.includes('(')) {\n let subtitleArray = name.split('(');\n name = subtitleArray[0].trim();\n }\n \n let words = name.split(\" \");\n\n let shortName = '';\n let foundPrep = false;\n let foundNonPrep = false;\n let counter = 0;\n\n //do not stop once we \n words.forEach(word => {\n let isPrep = prepositions.includes(word.toLowerCase());\n let isAbbreviated = isAbbreviation(word);\n\n if (foundPrep) {\n if (!foundNonPrep) {\n //keep adding until we find a non-prep\n shortName = shortName.appendData(word, ' ');\n }\n }\n else{\n //have not found a prep and we are still less than 3, add it\n if (!foundNonPrep) {\n shortName = shortName.appendData(word, ' ');\n }\n else{\n if (counter < 3 && !isPrep) {\n shortName = shortName.appendData(word, ' ');\n }\n }\n }\n\n if (isPrep || isAbbreviated) {\n foundPrep = true;\n }\n else{\n foundNonPrep = true;\n }\n\n counter++;\n });\n\n return shortName.trim();\n}\n\nfunction isAbbreviation(word){\n\n //TODO: adding this breaks another test....so leaving this in as hardcoded for now\n //easy switch once we decide\n return false;\n\n if (typeof word == 'undefined'){\n return false;\n }\n\n if (word.length == 0) {\n return false;\n }\n \n //logic going to be anything that is single letters followed by a .\n let isAbbreviatied = false;\n\n word = word.trim();\n\n if (word.endsWith('.')) {\n \n //now see if we split this, all they all single letters\n let array = word.split('.');\n\n if (array.length > 0) {\n let allSingles = true;\n\n array.forEach(item => {\n if (item.length > 1) {\n allSingles = false;\n }\n });\n\n isAbbreviatied = allSingles;\n }\n }\n\n return isAbbreviatied;\n}\n\nfunction getSecondaryReferenceName(contributor){\n var name = '';\n\n switch (contributor.type) {\n case 'author':\n case 'chapterAuthor':\n case 'custom':\n case 'executiveProducer':\n case 'executiveDirector':\n case 'executiveDirectorProducer':\n case 'director':\n case 'writer':\n case 'writerDirector':\n case 'host':\n case 'interview':\n\n case 'editor':\n case 'chapterTranslator':\n case 'translator':\n case 'narrator':\n case 'illustrator':\n case 'originalEditor':\n case 'performer':\n case 'chair':\n case 'reviewAuthor':\n case 'reviewDirector':\n case 'reviewWriter':\n case 'reviewWriterDirector':\n case 'reviewArtist':\n case 'reviewComposer':\n case 'reviewEditor':\n case 'volumeEditor':\n \n if (contributor.firstName && contributor.firstName.trim().length > 0) {\n name = contributor.firstName;\n }\n \n if (contributor.middleName && contributor.middleName.trim().length > 0) {\n name = name + ' ' + contributor.middleName;\n }\n\n if (contributor.lastName && contributor.lastName.trim().length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n \n name = name + contributor.lastName.trim();\n }\n\n var suffix = '';\n if (contributor.suffix && contributor.suffix.trim().length > 0) {\n suffix = contributor.suffix.trim();\n\n if (suffix.toLowerCase() == 'junior') {\n suffix = 'Jr.';\n }\n\n if (suffix.toLowerCase() == 'senior') {\n suffix = 'Sr.';\n }\n\n if (suffix.toLowerCase().startsWith('jr') ||\n suffix.toLowerCase().startsWith('sr')) {\n \n name = name + ',';\n }\n }\n\n if (suffix.length > 0) {\n name = name + ' ' + suffix;\n\n if (!name.endsWith(\".\")) {\n name = name + '.'\n }\n }\n\n break;\n case 'userName':\n\n if (contributor.firstName && contributor.firstName.trim().length > 0) {\n name = contributor.firstName;\n }\n \n if (contributor.middleName && contributor.middleName.trim().length > 0) {\n name = name + ' ' + contributor.middleName;\n }\n\n if (contributor.lastName && contributor.lastName.trim().length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n \n name = name + contributor.lastName.trim();\n }\n\n var suffix = '';\n if (contributor.suffix && contributor.suffix.trim().length > 0) {\n suffix = contributor.suffix.trim();\n\n if (suffix.toLowerCase() == 'junior') {\n suffix = 'Jr.';\n }\n\n if (suffix.toLowerCase() == 'senior') {\n suffix = 'Sr.';\n }\n\n if (suffix.toLowerCase().startsWith('jr') ||\n suffix.toLowerCase().startsWith('sr')) {\n \n name = name + ',';\n }\n }\n\n if (suffix.length > 0) {\n name = name + ' ' + suffix;\n\n if (!name.endsWith(\".\")) {\n name = name + '.'\n }\n }\n\n let userName = '';\n \n if (contributor.name) {\n userName = contributor.name.trim();\n }\n \n //see if we have username only\n if (name.length == 0) {\n \n name = userName;\n }\n else{\n if (userName.length > 0) {\n name = name + ' [' + userName + ']';\n }\n }\n break;\n case 'groupAuthor':\n case 'reviewGroupArtist':\n case 'groupPerformer':\n if(contributor.groupName){\n\t\t\t\tname = contributor.groupName.trim();\n }\n \n let contributorname = getStringValue(contributor.name);\n \n if (contributorname.length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n\n name = name + '[' + contributorname + ']';\n }\n\n break;\n case 'testimony':\n \n if(contributor.firstName){\n name = contributor.firstName.trim();\n }\n\n if(contributor.lastName){\n\n if (contributor.lastName.trim().length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n \n name = name + contributor.lastName.trim(); \n }\n }\n\n break;\n }\n\n return name;\n}\n\nfunction fixClosure(part){\n \n if (part.length > 0) {\n if (!part.endsWith('.') && !part.endsWith('?') && !part.endsWith('!')\n && !part.endsWith('.') && !part.endsWith('?') && !part.endsWith('!')) {\n part = part + \".\";\n } \n\n //if this ends with the a title in double quotes, followed by a period, we need to move the period inside the quote\n if (part.endsWith('\".')) {\n\n let title = part.slice(0, -2);\n let punctuation = '.\"';\n\n if (title.endsWith('!') || title.endsWith('?') || title.endsWith('.')) {\n //if this is an ellipsis, it still needs an extra period\n if (!title.endsWith('...')) {\n punctuation = '\"';\n }\n }\n\n part = title + punctuation;\n }\n }\n\n return part;\n}\n\nfunction getContributorsByType(type, contributors){\n let typeContribs = [];\n\n if (typeof contributors == 'undefined'){\n return typeContribs;\n }\n\n _forEach(contributors, (item) => {\n if (item.type == type) {\n typeContribs.push(item);\n }\n\n //for authors. we also need to group in Group Authors and Usernames\n if (type == 'author') {\n if (item.type == 'groupAuthor' || item.type == 'userName') {\n typeContribs.push(item);\n }\n }\n\n if (type == 'groupAuthor') {\n if (item.type == 'author' || item.type == 'userName') {\n typeContribs.push(item);\n }\n }\n\n if (type == 'userName') {\n if (item.type == 'groupAuthor' || item.type == 'author') {\n typeContribs.push(item);\n }\n }\n });\n\n return typeContribs;\n}\n\nfunction appendDOIURL(doi){\n let url = '';\n\n if (doi.length > 0) {\n if (!doi.startsWith('https://doi.org/') && !doi.startsWith('http://doi.org/') ) {\n\n //in case they enter a URL in the DOI\n if ((doi.startsWith('https:') || doi.startsWith('http:'))) {\n\n if (doi.startsWith('https://dx.doi.org/') || doi.startsWith('http://dx.doi.org/')) {\n doi = doi.replace('https://dx.doi.org/', '');\n doi = doi.replace('http://dx.doi.org/', '');\n\n url = 'https://doi.org/' + doi;\n }else{\n return formatURL(doi);\n }\n }\n else{\n //if they happen to start this with dx.doi.org, pull that out\n \n doi = doi.replace('dx.doi.org/', '');\n doi = doi.replace('doi.org/', '');\n\n url = 'https://doi.org/' + doi;\n }\n }\n else{\n url = doi;\n }\n\n url = formatURL(url);\n }\n\n return url;\n}\n\nfunction formatURL(url){\n let formatURL = '';\n\n let urlText = url;\n\n if (!urlText.toLowerCase().includes('doi.org')) {\n urlText = urlText.replace('https://', ''); \n urlText = urlText.replace('http://', '');\n }\n \n if (url.length > 0) {\n formatURL = '' + urlText + '';\n }\n\n return formatURL;\n}\n\nfunction getYear(date){\n var year = '';\n\n if (typeof date == 'undefined'){\n return '';\n }\n\n date = fixPageDash(date);\n\n //2018-2020 need to be abbrivated as 2018-20\n if (date.includes('–')) {\n var array = date.split(\"–\");\n\n if (array.length == 2) {\n\n //trim both entries\n array[0] = array[0].trim();\n array[1] = array[1].trim();\n\n //both 4 chars\n if (array[0].length == 4 && array[1].length == 4) {\n if (array[0].substring(0, 2) == array[1].substring(0, 2)) {\n year = array[0] + '-' + array[1].substring(2);\n return fixPageDash(year);\n }\n }\n }\n }\n\n //see if the format is either 2019 or 2/2/2019 or 2018/2020\n if (date.includes(\"/\")) {\n //split into an array and grab the last entry in that array\n var array = date.split(\"/\");\n\n if (array.length == 2) {\n //both 4 chars\n if (array[0].length == 4 && array[1].length == 4) {\n if (array[0].substring(0, 2) == array[1].substring(0, 2)) {\n year = array[0] + '-' + array[1].substring(2);\n return fixPageDash(year);\n }\n }\n }\n\n year = array[array.length-1]\n }\n else{\n if (date.length > 4) {\n\n //2018-2020\n if (date.includes(\"-\")) {\n year = date;\n }\n else {\n try {\n year = dateHelper.format(date, \"yyyy\");\n }\n catch(err) {\n console.log('Failed to convert year of ' + date);\n console.log(err);\n year = date;\n }\n }\n }\n else {\n //assume this is only a year\n year = date;\n }\n }\n\n return year;\n}\n\nfunction getMonthYear(date){\n let monthYear = '';\n\n if (typeof date == 'undefined'){\n return '';\n }\n\n let year = getYear(date);\n\n //see if a month is included\n let month = '';\n\n if (date.length > 4) {\n //possible formats 3/2020 or March 2020\n\n let dashArray = date.split('/');\n let spaceArray = date.split(' ');\n\n if (dashArray.length == 2) {\n //for the format of May/June 2019\n if (dashArray[1].includes(\" \")) {\n return date;\n } \n\n month = getMonthFromDate(date);\n }\n\n if (spaceArray.length == 2) {\n month = getMonthFromDate(date);\n }\n }\n\n monthYear = month;\n\n if (monthYear.length > 0) {\n monthYear = monthYear + ' ';\n }\n\n monthYear = monthYear + year;\n\n return monthYear;\n}\n\nfunction getFullDate(date){\n\n if (typeof date == 'undefined'){\n return '';\n }\n\n if (date.length == 0) {\n date = '';\n } else {\n if (date.includes(\"/\")) {\n var array = date.split(\"/\");\n\n let month = '';\n let day = '';\n let year = '';\n\n switch (array.length) {\n case 3:\n if (array[0].length > 0) {\n month = dateHelper.format(array[0] + '/1/2020', 'mmm.');\n }\n\n if (array[1].length > 0) {\n day = dateHelper.format('1/' + array[1] + '/2020', 'd');\n }\n\n if (array[2].length > 0) {\n year = dateHelper.format('1/1/' + array[2], 'yyyy');\n }\n\n break;\n case 2:\n //for the format of May/June 2019\n if (array[1].includes(\" \")) {\n return date;\n } \n\n if (array[0].length > 0) {\n month = dateHelper.format(array[0] + '/1/2020', 'mmm.');\n }\n\n if (array[1].length > 0) {\n year = dateHelper.format('1/1/' + array[1], 'yyyy');\n }\n\n break;\n case 1: \n if (array[0].length > 0) {\n year = dateHelper.format('1/1/' + array[0], 'yyyy');\n }\n\n break;\n }\n\n date = '';\n\n if (day.length > 0) {\n date = day;\n }\n\n if (month.length > 0) {\n if (day.length > 0) {\n date = date + ' '\n }\n\n date = date + month;\n }\n\n if (year.length > 0) {\n if (date.length > 0) {\n date = date + ' ';\n }\n\n date = date + year;\n }\n \n } else {\n date = date;\n }\n }\n\n if (date == '//') {\n date = '';\n }\n \n //fix the weirdness with short months\n date = date.replace('May.', 'May');\n date = date.replace('Jul.', 'July');\n date = date.replace('Jun.', 'June');\n date = date.replace('Sep.', 'Sept.');\n\n //if this includes a dash, clean it up\n date = fixPageDash(date);\n\n //fix any weirdness with present and spacing\n date = date.replace('– present', '–present')\n\n return date;\n}\n\nfunction getMonthFromDate(date) {\n let month = '';\n \n try {\n month = dateHelper.format(date, \"mmm.\");\n }\n catch(err) {\n console.log('Failed to convert month of ' + date);\n console.log(err);\n }\n\n if (month.length > 0) {\n month = month.replace('May.', 'May');\n month = month.replace('Jul.', 'July');\n month = month.replace('Jun.', 'June');\n date = date.replace('Sep.', 'Sept.');\n }\n\n return month;\n}\n\nfunction getFullDateRange(startDate, endDate){\n\n //get the format for the start date, and we'll append the range to that\n let fullDate = getFullDate(startDate);\n\n let startYear = getYearFromDate(startDate);\n let startMonth = getMonthFromDate(startDate);\n let startDay = getDayFromDate(startDate);\n\n let endYear = getYearFromDate(endDate);\n let endMonth = getMonthFromDate(endDate);\n let endDay = getDayFromDate(endDate);\n\n let fullDateRange = ''; \n\n //same year and month and day\n if (startYear == endYear && startMonth == endMonth && startDay == endDay) {\n fullDateRange = fullDate;\n }\n\n //same year and month\n if (fullDateRange.length == 0) {\n if (startYear == endYear && startMonth == endMonth) {\n fullDateRange = startDay + '–' + endDay + ' ' + startMonth + ' ' + startYear;\n }\n }\n \n //same year\n if (fullDateRange.length == 0) {\n if (startYear == endYear) {\n fullDateRange = startDay + ' ' + startMonth + '–' + endDay + ' ' + endMonth + ' ' + startYear;\n }\n }\n \n if (fullDateRange.length == 0) {\n fullDateRange = fullDate + '–' + getFullDate(endDate);\n }\n\n //fix the weirdness with short months\n fullDateRange = fullDateRange.replace('May.', 'May');\n fullDateRange = fullDateRange.replace('Jul.', 'July');\n fullDateRange = fullDateRange.replace('Jun.', 'June');\n fullDateRange = fullDateRange.replace('Sep.', 'Sept.');\n\n return fullDateRange;\n}\n\nfunction getYearFromDate(date){\n let year = '';\n var array = date.split(\"/\");\n\n switch (array.length) {\n case 3:\n if (array[2].length > 0) {\n year = dateHelper.format('1/1/' + array[2], 'yyyy');\n }\n break;\n case 2:\n if (array[1].length > 0) {\n year = dateHelper.format('1/1/' + array[1], 'yyyy');\n }\n break;\n case 1: \n if (array[0].length > 0) {\n year = dateHelper.format('1/1/' + array[0], 'yyyy');\n }\n break;\n }\n\n return year;\n}\n\nfunction getDayFromDate(date){\n var array = date.split(\"/\");\n let day = '';\n\n switch (array.length) {\n case 3:\n\n if (array[1].length > 0) {\n day = dateHelper.format('1/' + array[1] + '/2020', 'd');\n }\n break;\n }\n\n return day;\n}\n\nfunction formatOriginalPublicationDate(date) {\n // We have to convert 'ca.' or 'c.' to 'circa' in MLA. \n //Also need to remove periods for B.C.E., C.E., A.D., B.C.if used in originalPublicationDate.\n\n date = date.replace('ca. ', 'circa ');\n date = date.replace('c. ', 'circa ');\n date = date.replace(' B.C.E.', ' BCE');\n date = date.replace(' C.E.', ' CE');\n date = date.replace(' A.D.', ' AD');\n date = date.replace(' B.C.', ' BC');\n\n return date;\n}\n\nfunction getPublisherString(publishers, type, italicize){\n let publisherString = '';\n\n if (typeof publishers == 'undefined'){\n return '';\n }\n \n //if not passed in, assume they are not\n if (typeof italicize == 'undefined'){\n italicize = false;\n }\n\n //if a type is not passed in default to reference\n if (typeof type == 'undefined'){\n type = 'reference';\n }\n \n //filter these for type: reference\n let refPublishers = [];\n\n publishers.forEach(item => {\n if (item.type == type && item.name.length > 0) {\n refPublishers.push(item);\n }\n });\n\n publishers = removeEmptyPublishers(publishers);\n\n //1 Publisher\n if (refPublishers.length == 1) {\n \n let name = refPublishers[0].name;\n\n if (italicize) {\n name = name.italicize();\n }\n \n return name;\n }\n\n //More than 1\n if (refPublishers.length > 1) {\n \n var counter = 0;\n refPublishers.forEach(item => {\n if (counter > 0) {\n publisherString = publisherString + ' / ';\n }\n\n let name = item.name;\n \n if (italicize) {\n name = name.italicize();\n }\n\n publisherString = publisherString + name;\n \n counter++;\n });\n\n // if (!publisherString.endsWith(\".\")) {\n // publisherString = publisherString + '.'\n // }\n }\n \n publisherString = publisherString.replaceAmpersand();\n\n return publisherString;\n}\n\nfunction getCitations(citationData, primaryInfo, citationTitle, citationDate, shortenPageNumber){\n\n if (typeof citationTitle === 'undefined') {\n citationTitle = '';\n }\n\n if (typeof citationDate === 'undefined') {\n citationDate = '';\n }\n\n if (typeof shortenPageNumber === 'undefined') {\n shortenPageNumber = false;\n }\n\n let firstCitation = ''\n let subsequentCitation = ''; //don't think this is ever used right now, but saving it in here just in case we want to add to it later\n let location = getCitationLocationString(citationData, shortenPageNumber);\n\n //check to see if any data needs clearing out\n if (citationData.namePart == 'false') {\n primaryInfo = '';\n }\n \n if (primaryInfo.length > 0) {\n firstCitation = primaryInfo;\n }\n\n if (location.length > 0) {\n\n if (firstCitation.length > 0) {\n if (citationData.type != 'page'\n && citationData.type != 'time'\n && citationData.type != 'actSceneLine') {\n\n //check our punctionation\n if (firstCitation.endsWith('\"')) {\n firstCitation = firstCitation.slice(0, -1) + ',\" ';\n }\n else{\n //if this has a punctuation, then a comma is not needed\n if (firstCitation.endsWith('!') || firstCitation.endsWith('!') ||\n firstCitation.endsWith('?') || firstCitation.endsWith('?')\n ){\n firstCitation = firstCitation + ' ';\n }\n else{\n //nothing special, add the comma\n firstCitation = firstCitation + ', ';\n }\n } \n }\n else{\n if (!location.startsWith(',')) {\n firstCitation = firstCitation + ' ';\n }\n }\n }\n\n firstCitation = firstCitation + location;\n }\n\n\n //trim these back\n firstCitation = firstCitation.trim();\n\n //make sure neither citation ends with a , or ,\"\n if (firstCitation.endsWith(',')) {\n firstCitation = firstCitation.substr(0, firstCitation.length -1);\n }\n\n if (firstCitation.endsWith(',\"')) {\n firstCitation = firstCitation.substr(0, firstCitation.length -2) + '\"';\n }\n\n let titleCitation = '';\n\n if (citationTitle.length > 0) {\n titleCitation = primaryInfo + \", \" + citationTitle.shortenName().toTitleCase().italicize();\n\n if (location.length > 0) {\n titleCitation = titleCitation + \" \" + location;\n }\n }\n\n let dateCitation = '';\n\n if (citationDate.length > 0) {\n dateCitation = primaryInfo + \", \" + citationDate;\n\n if (location.length > 0) {\n dateCitation = dateCitation + \", \" + location;\n }\n }\n\n let citation = {\n first : firstCitation,\n subsequent : subsequentCitation,\n withTitle : titleCitation,\n withDate : dateCitation\n }\n\n return citation;\n}\n\nfunction getCitationLocationString(citationData, shortenPageNumber){\n var location = '';\n\n if (typeof shortenPageNumber === 'undefined') {\n shortenPageNumber = false;\n }\n\n let citationVolume = getCitationVolume(citationData);\n if (citationData.value == '' && citationData.type != 'actSceneLine' && citationVolume.length == 0) {\n return '';\n }\n\n switch (citationData.type) {\n case 'notdirect':\n location = '';\n break;\n case 'page':\n location = formatPageNumbers(citationData.value, false, true, shortenPageNumber);\n\n if (citationVolume.length > 0) {\n if (citationData.value.length == 0) {\n location = ', vol. ' + citationVolume;\n }else{\n location = ', vol. ' + citationVolume + ', ' + location;\n }\n }\n\n break;\n case 'paragraph':\n var label = 'par.';\n\n if (usePluralLabel(citationData.value)) {\n label = 'pars.'\n }\n\n location = label + ' ' + citationData.value;\n break;\n case 'chapter':\n location = 'ch. ' + citationData.value;\n break;\n case 'track':\n location = 'tr. ' + citationData.value;\n break;\n case 'figure':\n var label = 'fig.';\n\n if (usePluralLabel(citationData.value)) {\n label = 'figs.'\n }\n\n location = label + ' ' + citationData.value;\n break;\n case 'table':\n var label = 'tab.';\n\n if (usePluralLabel(citationData.value)) {\n label = 'tabs.'\n }\n\n location = label + ' ' + citationData.value;\n break;\n case 'time':\n\n let value = '';\n //we need to reformat strings like 1:14:30 as 01:14:30\n let timeArray = [];\n\n if (citationData.value.includes(':')) {\n timeArray = citationData.value.split(\":\");\n }\n\n if (citationData.value.includes('/')) {\n timeArray = citationData.value.split(\"/\");\n }\n\n\n if (timeArray.length > 0) {\n let newTimeFormat = '';\n\n if (timeArray.length == 2) {\n newTimeFormat = '00';\n }\n\n timeArray.forEach(item => {\n \n let newItem = item;\n\n switch (item.length) {\n case 0:\n newItem = '00';\n break;\n case 1:\n newItem = '0' + item;\n break;\n }\n\n if (newTimeFormat.length > 0) {\n newTimeFormat = newTimeFormat + ':';\n }\n\n newTimeFormat = newTimeFormat + newItem;\n });\n\n value = newTimeFormat;\n }\n else{\n value = citationData.value;\n }\n \n location = value;\n break;\n case 'section':\n var label = 'sec.';\n\n if (usePluralLabel(citationData.value)) {\n label = 'secs.'\n }\n\n location = label + ' ' + citationData.value;\n break;\n case 'actSceneLine':\n location = fixPageDash(citationData.value);\n location = location.split(\"/\").join(\".\");\n\n if (location.endsWith('.')) {\n location = location.substring(0, location.length - 1);\n }\n\n break;\n case 'other':\n case 'religious':\n\n location = citationData.label;\n\n if (citationData.label.length > 0) {\n location = location + ' ';\n }\n\n //: are replaced with . in MLA\n let citationValue = citationData.value;\n\n citationValue = citationValue.replace(':', '.');\n \n location = location + citationValue;\n break;\n }\n\n return location;\n}\n\nfunction fixPageDash(pages){\n \n let cleanPages = ''\n\n cleanPages = pages.replace('-', '–');\n cleanPages = cleanPages.replace(' - ', '–');\n cleanPages = cleanPages.replace(' – ', '–');\n\n return cleanPages;\n}\n\nfunction usePluralLabel(value){\n let use = false;\n\n if (value.includes('-') || \n value.includes(':') ||\n value.includes('–') ||\n value.includes(',')) {\n \n use = true;\n }\n\n return use;\n}\n\nfunction fixEditionString(edition){\n\n if (edition.length > 0) {\n\n //if this is an integer, make it ordinal\n if (isInteger(edition)) {\n edition = getOrdinalValue(edition);\n }\n\n // //replace edition with ed.\n // if (edition.includes('edition')) {\n // edition = edition.replace('edition', 'ed.');\n // } \n\n // //replace edition with Ed.\n // if (edition.includes('Edition')) {\n // edition = edition.replace('Edition', 'ed.');\n // } \n\n //add ed if needed\n if (!edition.includes('ed.') && !edition.toLowerCase().includes('edition')) {\n edition = edition + ' ed.'\n }\n \n //if the string includes ed., is not at the end, and does not follow with a comma, add it\n if (edition.includes('ed.') &&\n !edition.endsWith('ed.') &&\n !edition.includes('ed.,')) {\n edition = edition.replace('ed.', 'ed.,');\n }\n }\n \n return edition;\n}\n\nfunction fixFormatString(format){\n\n format = fixEditionString(format);\n \n return format;\n}\n\nfunction removeDescriptionFromTitle(title)\n{\n title = title.trim();\n\n if (title.startsWith('[')) {\n title = title.slice(1);\n\n //remove the ending bracket too\n if (title.endsWith(']')) {\n title = title.slice(0, -1);\n }\n }\n\n return title;\n}\n\nfunction isInteger(value) {\nreturn !isNaN(value) && \n parseInt(Number(value)) == value && \n !isNaN(parseInt(value, 10));\n}\n\nfunction getOrdinalValue(value){\n //https://stackoverflow.com/questions/13627308/add-st-nd-rd-and-th-ordinal-suffix-to-a-number\n if (isInteger(value)) {\n var j = value % 10,\n k = value % 100;\n if (j == 1 && k != 11) {\n return value + \"st\";\n }\n if (j == 2 && k != 12) {\n return value + \"nd\";\n }\n if (j == 3 && k != 13) {\n return value + \"rd\";\n }\n return value + \"th\";\n }\n\n return value;\n}\n\nfunction formatPageNumbers(pages, addLabel, isCitation, shortenPageNumber){\n\n if (typeof addLabel === 'undefined') {\n addLabel = true;\n }\n\n if (typeof isCitation === 'undefined') {\n isCitation = false;\n }\n\n if (typeof shortenPageNumber === 'undefined') {\n shortenPageNumber = false;\n }\n \n pages = fixPageDash(pages);\n\n //for MLA, multiple pages are shortened and only add a + at the end\n //so \"13–21, 27\" becomes \"13–21+\"\"\n //this is only for references, citations do not break non-consecutive page numbers\n if (pages.includes(',') && (!isCitation || shortenPageNumber)) {\n let array = pages.split(\",\");\n\n pages = array[0] + \"+\";\n }\n\n //MLA also shortens page numbers in this way\n //1122–1128 becomes 1122–28\n //dupicate numbers have to have at least 2\n if (pages.includes('–')) {\n\n let hasPlus = false;\n if (pages.endsWith('+')) {\n hasPlus = true;\n pages = pages.slice(0, -1)\n }\n\n let array = pages.split(\"–\");\n\n if (isInteger(array[0]) && isInteger(array[1])) {\n if (array[0].length == array[1].length) {\n if (array[0].length > 2) {\n \n //loop each number until we find the one that doesnt match\n let match = -1;\n for (var i = 0; i < array[0].length; i++) {\n \n if (array[0][i] != array[1][i]) {\n \n if (match == -1) {\n match = i;\n }\n }\n }\n \n if (match != -1) {\n //if it's only the last number, we need to add one to it\n if ((match + 1) == array[1].length) {\n match = match - 1;\n }\n \n pages = array[0] + \"–\" + array[1].substring(match);\n }\n }\n }\n }\n\n //re-add our plus\n if (hasPlus) {\n pages = pages + '+';\n }\n }\n\n if (pages.length > 0 && addLabel) {\n var label = 'p.';\n if (pages.includes('-') || pages.includes('–') || pages.includes(':') || pages.includes('+')) {\n label = 'pp.';\n }\n\n pages = label + ' ' + pages;\n }\n\n return pages;\n}\n\nfunction abbreviate(text) {\n \n //pull out any odd characters\n let trimmed = text.trim();\n\n if (trimmed == 0) {\n return trimmed;\n }\n\n var abbreviations = [\n // ['issue', 'no.'],\n ['appendix', 'app.'],\n ['chapter', 'ch.'],\n ['edition', 'ed.'],\n ['figure', 'fig.'],\n ['note', 'n'],\n ['notes', 'nn'],\n ['number', 'no.'],\n ['section', 'sec.'],\n ['supplement', 'supp.'],\n ['version', 'vers.'],\n ['volume', 'vol.'],\n ['publication', 'pub.']\n ];\n\n //parse every word in the text and see if it is a word we need to abbreviate\n let sentence = trimmed.split(\" \");\n let newSentence = [];\n\n for (var i = 0; i < sentence.length; i++) {\n let thisWord = sentence[i];\n\n //check thisWord against every abbreviation\n let thisAbbreviation = '';\n for (let index = 0; index < abbreviations.length; index++) {\n let thisWordToAbbr = abbreviations[index][0];\n \n if (thisWord.toLowerCase() == thisWordToAbbr.toLowerCase()) {\n thisAbbreviation = abbreviations[index][1];\n }\n }\n\n //if we abbreviated, use it instead\n if (thisAbbreviation) {\n newSentence.push(thisAbbreviation);\n }\n else {\n newSentence.push(thisWord);\n }\n }\n\n return newSentence.join(\" \");\n}\n\nfunction ordinalToWord(ordinal){\n //havent came up with a good way to do this yet\n //so for now, we'll just do a comparison in this array\n let word = '';\n\n var conversions = [\n ['1st', 'First'],\n ['1rst', 'First'],\n ['2nd', 'Second'],\n ['2d', 'Second'],\n ['3rd', 'Third'],\n ['3d', 'Third'],\n ['4th', 'Fourth'],\n ['5th', 'Fifth'],\n ['6th', 'Sixth'],\n ['7th', 'Seventh'],\n ['8th', 'Eighth'],\n ['9th', 'Ninth'],\n ['10th', 'Tenth'],\n ['11th', 'Eleventh'],\n ['12th', 'Twelfth'],\n ['13th', 'Thirteenth'],\n ['14th', 'Fourteenth'],\n ['15th', 'Fifteenth'],\n ['16th', 'Sixteenth'],\n ['17th', 'Seventeenth'],\n ['18th', 'Eighteenth'],\n ['19th', 'Nineteenth'],\n ['20th', 'Twentieth'],\n ];\n\n for (let index = 0; index < conversions.length; index++) {\n let thisConversion = conversions[index][0];\n\n if (thisConversion == ordinal.toLowerCase()) {\n word = conversions[index][1];\n }\n } \n\n if (word == '') {\n //if we havent converted yet, just leave it as is\n word = ordinal;\n }\n\n return word;\n}\n\nfunction removeEmptyContributors(contributors){\n \n //remove any empty contributors from the array\n if (typeof contributors === 'undefined') {\n return [];\n }\n\n let cleanContributors = [];\n\n if (contributors.length > 0) {\n _forEach(contributors, (contributor) => {\n \n if (typeof contributor.type !== 'undefined') {\n\n switch (contributor.type) {\n case 'author':\n case 'chapterAuthor':\n case 'custom':\n case 'executiveProducer':\n case 'executiveDirector':\n case 'executiveDirectorProducer':\n case 'director':\n case 'writer':\n case 'writerDirector':\n case 'host':\n case 'interview':\n \n if(contributor.lastName.length > 0 ||\n contributor.firstName.length > 0 ||\n contributor.middleName.length > 0 ||\n contributor.suffix.length > 0){\n cleanContributors.push(contributor);\n }\n\n break;\n case 'editor':\n case 'chapterTranslator':\n case 'translator':\n case 'narrator':\n case 'illustrator':\n case 'originalEditor':\n case 'performer':\n case 'chair':\n case 'reviewAuthor':\n case 'reviewDirector':\n case 'reviewWriter':\n case 'reviewWriterDirector':\n case 'reviewArtist':\n case 'reviewComposer':\n case 'reviewEditor':\n case 'volumeEditor':\n\n if(contributor.lastName.length > 0 ||\n contributor.firstName.length > 0 ||\n contributor.middleName.length > 0 ||\n contributor.suffix.length > 0){\n cleanContributors.push(contributor);\n }\n \n break;\n case 'userName':\n \n if(contributor.lastName.length > 0 ||\n contributor.firstName.length > 0 ||\n contributor.middleName.length > 0 ||\n contributor.suffix.length > 0 ||\n contributor.name.length > 0){\n cleanContributors.push(contributor);\n }\n\n break;\n case 'groupAuthor':\n case 'reviewGroupArtist':\n\n if (typeof contributor.groupName === 'undefined') {\n break;\n }\n\n if(contributor.groupName.length > 0){\n cleanContributors.push(contributor);\n }\n\n break;\n case 'groupPerformer':\n\n if (typeof contributor.groupName === 'undefined') {\n break;\n }\n\n if (typeof contributor.abbreviation === 'undefined') {\n break;\n }\n\n if(contributor.groupName.length > 0 ||\n contributor.abbreviation.length > 0){\n cleanContributors.push(contributor);\n }\n\n break;\n case 'testimony':\n\n if(contributor.lastName.length > 0 ||\n contributor.firstName.length > 0){\n cleanContributors.push(contributor);\n }\n \n break;\n }\n }\n \n });\n }\n\n return cleanContributors;\n}\n\nfunction getCitationVolume(citationData) {\n let volume = getStringValue(citationData.volume);\n\n return volume;\n}\n\nfunction removeEmptyPublishers(publishers) {\n //remove any empty publishers from the array\n if (typeof publishers === 'undefined') {\n return [];\n }\n\n let cleanPublishers = [];\n\n if (publishers.length > 0) {\n\n _forEach(publishers, (publisher) => {\n let foundSomething = false;\n \n if (typeof publisher.type !== 'undefined') {\n if (publisher.type.length > 0) {\n foundSomething = true;\n }\n }\n\n if (typeof publisher.city !== 'undefined') {\n if (publisher.city.length > 0) {\n foundSomething = true;\n }\n }\n\n if (typeof publisher.name !== 'undefined') {\n if (publisher.name.length > 0) {\n foundSomething = true;\n }\n }\n\n if (typeof publisher.state !== 'undefined') {\n if (publisher.state.length > 0) {\n foundSomething = true;\n }\n }\n\n if (foundSomething) {\n cleanPublishers.push(publisher);\n }\n\n });\n\n }\n\n return cleanPublishers;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n \n citationTitle = shared.getStringValue(refData.title);\n\n if (citationTitle.length == 0) {\n citationTitle = shared.getStringValue(refData.content);\n }\n\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = true;\n\n let title = shared.getStringValue(refData.title);\n\n let formatTitle = false;\n if (title.length == 0) {\n titleProperty = 'content';\n formatTitle = true;\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle,formatTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n\tlet type = shared.getStringValue(refData.type);\n\n\tif(type === 'post'){\n\t\t// content\n\t\tlet content = shared.getStringValue(refData.content);\n\t\tif (content.length > 0) {\n\n if (primaryContributor.length > 0) {\n content = content.doubleQuote();\n }\n\n\t\t\tprimaryPart = primaryPart.appendData(content, ' ');\n\t\t}\n\t} else if(type === 'page' || type === 'forum'){\n\t\t// title\n\t\tlet title = shared.getStringValue(refData.title);\n\t\tif (title.length > 0) {\n title = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n title = title.doubleQuote();\n primaryPart = primaryPart.appendData(title, ' ');\n\t\t} else {\n\t\t\t// title is blank to use content\n\t\t\tlet content = shared.getStringValue(refData.content);\n\t\t\tif (content.length > 0) {\n\t\t\t\t// content = content.doubleQuote();\n\t\t\t\t// primaryPart = primaryPart.appendData(content, ', ');\n\t\t\t\tprimaryPart = primaryPart.appendData(content, ' ');\n\t\t\t}\n\t\t}\n\t}\n\n\t\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any first supplemental data needed\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n // platform\n let platform = shared.getStringValue(refData.platform);\n\tif (platform.length > 0) {\n\t\tplatform = platform.italicize();\n\t\tcontainer1 = container1.appendData(platform, ', ');\n\t}\n\n\t//publicationDate\n\tlet publicationDate = shared.getStringValue(refData.publicationDate);\n\tpublicationDate = shared.getFullDate(publicationDate);\n\tcontainer1 = container1.appendData(publicationDate, ', ');\n\n //url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n\n\t//retrievalDate\n\tlet retrievalDate = shared.getStringValue(refData.retrievalDate);\n\tretrievalDate = shared.getFullDate(retrievalDate);\n\tsecondSupplemental = secondSupplemental.appendData(retrievalDate, ', ', 'Accessed');\n\n\tif(type === 'post' || type === 'forum'){\n\t\t// attachment\n\t\tlet attachment = shared.getStringValue(refData.attachment);\n\t\tif(attachment.length > 0){\n\t\t\tattachment = attachment.toLowerCase();\n\t\t\tsecondSupplemental = secondSupplemental.appendData(attachment, ', ');\n\t\t}\n\t} else if(type === 'page'){\n\t\t// description\n\t\tlet description = shared.getStringValue(refData.description);\n\t\tif(description.length > 0){\n\t\t\tdescription = description.toLowerCase();\n\t\t\tsecondSupplemental = secondSupplemental.appendData(description, ', ');\n\t\t}\n\t}\n\t\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n if (refData.type == 'reference') {\n citationTitle = shared.getStringValue(refData.entry);\n }\n else{\n citationTitle = shared.getStringValue(refData.title); \n }\n\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n let type = shared.getStringValue(refData.type);\n\n if (type == 'reference') {\n titleProperty = 'entry';\n isSecondaryTitle = true;\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\n\n let title = '';\n\n\n if (type == 'reference') {\n title = shared.getStringValue(refData.entry);\n \n if (title.length > 0) {\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.doubleQuote();\n }\n }\n }\n else{\n title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.italicize();\n }\n }\n }\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let version = shared.getStringValue(refData.version);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n publicationDate = shared.formatOriginalPublicationDate(publicationDate);\n\n let publishers = shared.getPublisherString(refData.publishers, 'reference', true);\n\n switch (type) {\n case 'computer':\n \n container1 = container1.appendData(version, ', ', 'version');\n container1 = container1.appendData(publishers, ', ');\n\n container1 = container1.appendData(publicationDate, ', ');\n\n let url = shared.getStringValue(refData.url);\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n\n break;\n case 'mobile':\n \n container1 = container1.appendData(version, ', ', 'version');\n container1 = container1.appendData(publicationDate, ', ');\n\n break;\n case 'reference':\n \n let title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.italicize();\n }\n container1 = container1.appendData(title, '');\n }\n\n container1 = container1.appendData(version, ', ', 'version');\n container1 = container1.appendData(publicationDate, ', ');\n\n break;\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publishers == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publishers)) {\n container1 = container1.upperFirstLetter();\n }\n }\n \n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type != 'computer') {\n let publishers = shared.getPublisherString(refData.publishers, 'reference', true);\n container2 = container2.appendData(publishers, ', ');\n\n let url = shared.getStringValue(refData.url);\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n container2 = container2.appendData(url, ', ');\n }\n }\n \n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n //if all they have given is a description, then we do not need to add the label\n let title = '';\n let descriptionOnly = false;\n\n if (type == 'reference') {\n title = shared.getStringValue(refData.entry);\n }\n else{\n title = shared.getStringValue(refData.title);\n }\n\n if (title.length > 0) {\n if (title.startsWith('[')) {\n descriptionOnly = true;\n }\n }\n\n if (!descriptionOnly) {\n if (type == 'computer') {\n secondSupplemental = secondSupplemental.appendData('Computer software.', '');\n }\n else{\n secondSupplemental = secondSupplemental.appendData('Mobile app.', '');\n }\n }\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const _cloneDeep = require('lodash/cloneDeep');\nconst shared = require('../MLA9/MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n specialRules\n};\n\nfunction specialRules(references){\n\tlet _references = [];\n\n //iterarate each reference to update it's value\n references.forEach((thisReference) => {\n\t\t// clone thisReference so i can manipulate it\n\t\tlet _thisReference = _cloneDeep(thisReference);\n\n let typeName = getTypeShortName(_thisReference.referenceTypeID);\n \n let typeEngine = getTypeEngine(typeName);\n let engineRef;\n let refDataObject; \n \n if (typeof _thisReference.data === 'string') {\n refDataObject = JSON.parse((_thisReference.data));\n }\n else{\n refDataObject = _thisReference.data;\n }\n\n engineRef = typeEngine.getReference(refDataObject);\n \n _thisReference.authorPart = engineRef.authorPart;\n _thisReference.authorPartNoLabel = engineRef.authorPartNoLabel;\n _thisReference.authorPartSort = engineRef.authorPartSort;\n _thisReference.sameAuthorPartID = 0;\n _thisReference.sameAuthorPartEtAlID = 0;\n _thisReference.citationTitle = engineRef.citationTitle;\n _thisReference.citationShortTitle = engineRef.citationTitle;\n\n if (_thisReference.citationShortTitle.length > 0) {\n _thisReference.citationShortTitle = _thisReference.citationShortTitle.shortenName();\n }\n\n //_thisReference.newDatePart = '';\n _thisReference.displayValue = engineRef.value;\n _thisReference.orderByValue = shared.getOrderByValue(_thisReference);\n //_thisReference.citationEtAlOverwrite = '';\n\n let citationData = new Object;\n citationData.namePart = true;\n citationData.datePart = true;\n citationData.label = '';\n citationData.value = '';\n citationData.type = 'notdirect';\n \n _thisReference.indirectCitation = typeEngine.getCitation(refDataObject, citationData, references);\n\n //update the citations for this reference\n if (_thisReference.citations != undefined) {\n\n //see if this is a simgle object, or an array\n if (Array.isArray(_thisReference.citations)) {\n\n let counter = 1;\n\n _thisReference.citations.forEach(thisCitation => {\n\n thisCitation.mla9 = typeEngine.getCitation(refDataObject, thisCitation.citationData, references);\n\n // if (counter > 1 && thisCitation.apa7.subsequent != '') {\n // thisCitation.displayValue = '(' + thisCitation.apa7.subsequent + ')';\n // }\n // else{\n thisCitation.displayValue = '(' + thisCitation.mla9.first + ')';\n // }\n \n counter++;\n });\n }\n else{\n if (typeof _thisReference.citations === 'object' && _thisReference.citations !== null) {\n _thisReference.citations.mla9 = typeEngine.getCitation(refDataObject, _thisReference.citations.citationData, references);\n _thisReference.citations.displayValue = '(' + _thisReference.citations.mla9.first + ')'; \n }\n }\n }\n\t\t_references.push(_thisReference);\n\n });//e:forEach\n\n //initial sort\n orderRefs(_references);\n\n //Same author parts\n sameAuthorParts(_references);\n \n //Grouped Citations\n groupedCitations(_references);\n\n return _references;\n}\n\nfunction getTypeShortName(id){\n //swap the ID to the short name from types.json\n var typeData = require('../types.json');\n let typeShortName = '';\n\n if (shared.isInteger(id)) {\n id = id.toString();\n }\n \n typeData.refTypes.forEach(thisType => {\n if (thisType.id == id) {\n typeShortName = thisType.shortname;\n }\n });\n \n return typeShortName;\n }\n\nfunction getTypeEngine(type){\n var typeEngine = null;\n\n typeEngine = require('./MLA9-' + type +'.js');\n\n return typeEngine;\n}\n\n function groupedCitations(references){\n\n //iterate and see if we have any grouped citations in the paper\n let groupCitationIds = [];\n\n references.forEach(thisRef => {\n\n if (thisRef.citations != undefined) {\n\n if (Array.isArray(thisRef.citations)) {\n for (var i = 0; i < thisRef.citations.length; i++) {\n let thisCitation = thisRef.citations[i];\n \n if (thisCitation.groupUniqueID != undefined) {\n if (thisCitation.groupUniqueID.length > 0) {\n \n //make sure this group id is not already in the list\n let found = false;\n groupCitationIds.forEach(thisGroupCitationID => {\n if (thisGroupCitationID.toUpperCase() == thisCitation.groupUniqueID.toUpperCase()) {\n found = true;\n }\n });\n \n if (!found) {\n groupCitationIds.push(thisCitation.groupUniqueID.toUpperCase());\n }\n \n }\n }\n }//e:for:citations\n }\n else{\n if (thisRef.citations.groupUniqueID != undefined) {\n if (thisRef.citations.groupUniqueID.length > 0) {\n //make sure this group id is not already in the list\n let found = false;\n groupCitationIds.forEach(thisGroupCitationID => {\n if (thisGroupCitationID.toUpperCase() == thisRef.citations.groupUniqueID.toUpperCase()) {\n found = true;\n }\n });\n \n if (!found) {\n groupCitationIds.push(thisRef.citations.groupUniqueID.toUpperCase());\n }\n }\n }\n }\n }\n\n });//e:for:references\n\n //process each group ID now\n groupCitationIds.forEach(thisGroupID => {\n\n let groupCitations = [];\n\n references.forEach(thisRef => {\n if (thisRef.citations != undefined) {\n\n if (Array.isArray(thisRef.citations)) {\n thisRef.citations.forEach(thisCitation =>{\n\n if (thisCitation.groupUniqueID != undefined) {\n if (thisCitation.groupUniqueID.toUpperCase() == thisGroupID.toUpperCase()) {\n \n //append some ref data that we may need in the next step building the output\n thisCitation.refAuthorPart = thisRef.authorPart;\n \n groupCitations.push(thisCitation);\n }\n }\n \n });//e:for:citations\n }\n else{\n if (thisRef.citations.groupUniqueID != undefined) {\n if (thisRef.citations.groupUniqueID.toUpperCase() == thisGroupID.toUpperCase()) {\n \n //append some ref data that we may need in the next step building the output\n thisRef.citations.refAuthorPart = thisRef.authorPart;\n\n groupCitations.push(thisRef.citations);\n }\n }\n }\n }\n });//e:for:references\n\n //make a pass through now to get our new value\n let groupValue = '';\n let lastRefAuthorPart = '';\n let lastCitationUsed = ''\n\n groupCitations.forEach(thisCitation => {\n\n let thisDisplay = thisCitation.displayValue;\n\n if (thisDisplay.startsWith('(')) {\n thisDisplay = thisDisplay.substring(1, thisDisplay.length);\n }\n\n if (thisDisplay.endsWith(')')) {\n thisDisplay = thisDisplay.substring(0, thisDisplay.length -1);\n }\n\n let displayToUse = thisDisplay;\n\n if (lastRefAuthorPart.length > 0) {\n if (thisCitation.refAuthorPart == lastRefAuthorPart) {\n\n //loop through until we find the part of this citation that start to differ from the last one we used\n let found = false;\n for (let i = 0; i < displayToUse.length; i++) {\n\n if (!found) {\n\n let thisChar = displayToUse.charAt(i);\n\n if (shared.isInteger(thisChar)) {\n displayToUse = displayToUse.substring(i, displayToUse.length);\n found = true;\n }\n else{\n if (displayToUse.charAt(i) != lastCitationUsed.charAt(i)) {\n displayToUse = displayToUse.substring(i, displayToUse.length);\n found = true;\n } \n } \n }\n }\n } \n }\n\n lastCitationUsed = thisDisplay;\n lastRefAuthorPart = thisCitation.refAuthorPart; \n \n if (displayToUse.length > 0) {\n if (groupValue.length > 0) {\n groupValue = groupValue + '; ';\n }\n\n groupValue = groupValue + displayToUse;\n }\n\n });//e:for:group citations\n\n if (groupValue.length > 0) {\n groupValue = '(' + groupValue + ')';\n }\n\n //now go back and set the display value back\n groupCitations.forEach(thisCitation => {\n thisCitation.displayValue = groupValue;\n });//e:for:group citations\n\n });\n\n }\n\n function orderRefs(references){\n //order the results\n references.sort((a, b) => {\n let textA = '';\n let textB = '';\n\n if (a.orderByValue !== null) {\n textA = a.orderByValue;\n }\n\n if (b.orderByValue !== null) {\n textB = b.orderByValue;\n }\n\n if (textA.length > 0) {\n textA = textA.toUpperCase();\n }\n\n if (textB.length > 0) {\n textB = textB.toUpperCase();\n }\n\n return textA < textB ? -1 : textA > textB ? 1 : 0;\n });//e:sort\n }\n\n function sameAuthorParts(references){\n //see which references have the same author parts\n let sameAuthorPartID = 1; \n let sameAuthorPartIDs = [];\n\n let sameAuthorPartEtAlID = 1; \n let sameAuthorPartEtAlIDs = [];\n \n references.forEach(thisReference => {\n \n if (thisReference.authorPart != '' && \n thisReference.sameAuthorPartID == 0) {\n \n //inner loop for this reference\n let foundMatches = false;\n let foundEtAlMatches = false;\n\n references.forEach(innerReference => {\n if (innerReference.referenceUniqueID != thisReference.referenceUniqueID &&\n innerReference.authorPartSort == thisReference.authorPartSort\n ) \n {\n //we found a matching author and date part\n foundMatches = true;\n thisReference.sameAuthorPartID = sameAuthorPartID;\n innerReference.sameAuthorPartID = sameAuthorPartID;\n }\n \n if (thisReference.displayValue.includes('et al.') &&\n innerReference.referenceUniqueID != thisReference.referenceUniqueID &&\n innerReference.authorPartNoLabel == thisReference.authorPartNoLabel) {\n \n if (thisReference.sameAuthorPartEtAlID == 0) {\n thisReference.sameAuthorPartEtAlID = sameAuthorPartEtAlID; \n foundEtAlMatches = true;\n }\n \n if (innerReference.sameAuthorPartEtAlID == 0) {\n innerReference.sameAuthorPartEtAlID = sameAuthorPartEtAlID; \n }\n }\n });\n \n //if we found a match, increment our id\n if (foundMatches) {\n sameAuthorPartIDs.push(sameAuthorPartID);\n sameAuthorPartID++;\n }\n\n if (foundEtAlMatches) {\n sameAuthorPartEtAlIDs.push(sameAuthorPartEtAlID);\n sameAuthorPartEtAlID++;\n }\n }\n \n });\n \n //change any authors after the initial entry to only be ---\n sameAuthorPartIDs.forEach(thisSameID =>{\n let matchingRefs = [];\n \n references.forEach(thisReference => {\n if (thisReference.sameAuthorPartID == thisSameID) {\n matchingRefs.push(thisReference);\n }\n });\n \n let counter = 0;\n matchingRefs.forEach(thisReference => {\n \n if (counter > 0) {\n \n let dashReplacement = '———';\n\n // if (thisReference.authorPart == thisReference.authorPartNoLabel) {\n // dashReplacement = dashReplacement + '.';\n // }\n\n if (thisReference.authorPartNoLabel.endsWith('.')) {\n thisReference.authorPartNoLabel = thisReference.authorPartNoLabel.substring(0, thisReference.authorPartNoLabel.length - 1);\n }\n \n thisReference.displayValue = thisReference.displayValue.replace(thisReference.authorPartNoLabel, dashReplacement);\n }\n \n counter++;\n });\n });\n \n //now we need to make sure that any citations do not match and have enough to identify\n //start with the matching et als\n sameAuthorPartEtAlIDs.forEach(thisSameID =>{\n let matchingRefs = [];\n \n references.forEach(thisReference => {\n if (thisReference.sameAuthorPartEtAlID == thisSameID) {\n matchingRefs.push(thisReference);\n }\n });\n\n //now go back thru each of the references and expand their citation for more information\n matchingRefs.forEach(thisReference => {\n\n let hasDuplicateTitlesAlso = false;\n\n matchingRefs.forEach(innerReference => {\n if (innerReference.referenceUniqueID != thisReference.referenceUniqueID &&\n innerReference.citationTitle == thisReference.citationTitle) {\n hasDuplicateTitlesAlso = true;\n }\n });\n\n ///go back thru and see if any other references in this list have the exact same title too\n //if so we'll use date instead of title\\\n if (thisReference.citations != undefined) {\n if (thisReference.citations.length > 0) {\n\n if (hasDuplicateTitlesAlso) {\n thisReference.citations.forEach(thisCitation => {\n if (thisCitation.mla9.withDate.length > 0) {\n thisCitation.displayValue = \"(\" + thisCitation.mla9.withDate + \")\";\n }\n });\n }\n else{\n thisReference.citations.forEach(thisCitation => {\n if (thisCitation.mla9.withTitle.length > 0) {\n thisCitation.displayValue = \"(\" + thisCitation.mla9.withTitle + \")\";\n }\n });\n }\n }\n }\n \n });\n \n });\n\n sameAuthorPartIDs.forEach(thisSameID =>{\n let matchingRefs = [];\n \n references.forEach(thisReference => {\n // if (thisReference.sameAuthorPartID == thisSameID) {\n if (thisReference.sameAuthorPartID == thisSameID && thisReference.sameAuthorPartEtAlID == 0) {\n matchingRefs.push(thisReference);\n }\n });\n\n //now go back thru each of the references and expand their citation for more information\n matchingRefs.forEach(thisReference => {\n\n let hasDuplicateTitlesAlso = false;\n\n matchingRefs.forEach(innerReference => {\n if (innerReference.referenceUniqueID != thisReference.referenceUniqueID &&\n innerReference.citationTitle == thisReference.citationTitle) {\n hasDuplicateTitlesAlso = true;\n }\n });\n\n ///go back thru and see if any other references in this list have the exact same title too\n //if so we'll use date instead of title\n if (thisReference.citations != undefined) {\n if (thisReference.citations.length > 0) {\n\n if (hasDuplicateTitlesAlso) {\n thisReference.citations.forEach(thisCitation => {\n if (thisCitation.mla9.withDate.length > 0) {\n thisCitation.displayValue = \"(\" + thisCitation.mla9.withDate + \")\";\n }\n });\n }\n else{\n thisReference.citations.forEach(thisCitation => {\n if (thisCitation.mla9.withTitle.length > 0) {\n thisCitation.displayValue = \"(\" + thisCitation.mla9.withTitle + \")\";\n }\n });\n }\n }\n }\n \n });\n });\n \n }","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n // let type = shared.getStringValue(refData.type);\n // let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let title = shared.getStringValue(refData.title);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t}\n\t\telse{\n title = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t\ttitle = title.italicize();\n\t\t}\n\t}\n\n if (title.length > 0) {\n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any first supplemental data needed\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n\t//Publishers\n\tlet publisherString = shared.getPublisherString(refData.publishers);\n\tcontainer1 = container1.appendData(publisherString, ', ');\n\n\t//publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n\t// doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n } else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n \n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any container data needed\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = 'Speech audio recording';\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n switch (type) {\n case 'federal':\n \n switch (kind) {\n case 'usc':\n citationTitle = 'United States Code';\n break;\n \n case 'pl':\n citationTitle = 'United States';\n break;\n }\n \n break;\n \n case 'state':\n\n let state = shared.getStringValue(refData.state);\n\n if (state.length > 0) {\n state = state + ' ';\n }\n\n state = state + 'State'; \n citationTitle = state;\n \n break;\n }\n\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryContributor = '';\n\n switch (type) {\n case 'federal':\n \n switch (kind) {\n case 'usc':\n primaryContributor = 'United States Code';\n break;\n \n case 'pl':\n primaryContributor = 'United States';\n break;\n }\n \n break;\n \n case 'state':\n\n let state = shared.getStringValue(refData.state);\n\n if (state.length > 0) {\n state = state + ' ';\n }\n\n state = state + 'State'; \n primaryContributor = state;\n \n break;\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n switch (type) {\n case 'federal':\n \n switch (kind) {\n case 'usc':\n primaryPart = 'United States Code';\n break;\n \n case 'pl':\n \n primaryPart = 'United States, Congress';\n \n let number = shared.getStringValue(refData.number);\n primaryPart = primaryPart.appendData(number, '. ', 'Public Law');\n \n break;\n }\n \n break;\n \n case 'state':\n\n let state = shared.getStringValue(refData.state);\n\n if (state.length > 0) {\n state = state + ' ';\n }\n\n state = state + 'State, Legislature'; \n primaryPart = state;\n \n break;\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let volume = shared.getStringValue(refData.volume);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n switch (type) {\n case 'federal':\n \n switch (kind) {\n case 'usc':\n //Title [volume], section [section], U.S. Government Publishing Office, [publicationDate], url.\n container1 = container1.appendData(volume, ', ', 'Title');\n\n let section = shared.getStringValue(refData.section);\n container1 = container1.appendData(section, ', ', 'section');\n\n container1 = container1.appendData('U.S. Government Publishing Office', ', ');\n\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n // doi/url\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n break;\n \n case 'pl':\n //United States Statutes at Large, vol. [volume], [publicationDate], p. [pageNumber].\n container1 = container1.appendData('United States Statutes at Large', ', ');\n\n container1 = container1.appendData(volume, ', ', 'vol.', '');\n\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n let pageNumber = shared.getStringValue(refData.pageNumber);\n pageNumber = shared.formatPageNumbers(pageNumber);\n container1 = container1.appendData(pageNumber, ', ');\n \n break;\n }\n \n break;\n \n case 'state':\n \n let sourceTitle = shared.getStringValue(refData.sourceTitle);\n container1 = container1.appendData(sourceTitle, ', ', '', '');\n\n let sourceLocation = shared.getStringValue(refData.sourceLocation);\n sourceLocation = sourceLocation.replace('§', 'section');\n container1 = container1.appendData(sourceLocation, ', ', '', '');\n \n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n // doi/url\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n break;\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (kind == 'pl') {\n container2 = container2.appendData('U.S. Government Publishing Office', ', ');\n \n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container2 = container2.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container2 = container2.appendData(url, ', ');\n }\n }\n }\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n let revisedDate = shared.getStringValue(refData.revisedDate);\n revisedDate = shared.getFullDate(revisedDate);\n secondSupplemental = secondSupplemental.appendData(revisedDate, ', ', 'Revised');\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}\n","const _forEach = require('lodash/forEach');\nconst shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n if (refData.type == 'episode') {\n citationTitle = shared.getStringValue(refData.episodeTitle);\n }\n else{\n citationTitle = shared.getStringValue(refData.title); \n }\n\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n //if there is a secondary title, fill this out here\n let type = shared.getStringValue(refData.type);\n\n //filter out our contribs to only custom \n let customContribs = [];\n customContribs = shared.getContributorsByType('custom', refData.contributors);\n\n //make a copy of refdata to pass off to the shared code\n let fakeRefDate = new Object();\n fakeRefDate.title = refData.title;\n fakeRefDate.contributors = customContribs;\n\n if (type == 'episode') {\n titleProperty = 'episodeTitle';\n fakeRefDate.episodeTitle = refData.episodeTitle;\n isSecondaryTitle = true;\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(fakeRefDate, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryCustomContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\n\n let title = '';\n\n //title will not be used in this section if this is a book chapter\n if (type == 'episode') {\n title = shared.getStringValue(refData.episodeTitle);\n \n if (title.length > 0) {\n \n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.doubleQuote();\n }\n }\n }\n else{\n title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.italicize();\n }\n }\n }\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let publisherString = shared.getPublisherString(refData.publishers);\n\n if (type == 'series') {\n //Secondary Contribs\n let secondaryContributor = getSecondaryContributorString(refData.contributors);\n container1 = container1.appendData(secondaryContributor, ', ');\n\n //Publishers\n container1 = container1.appendData(publisherString, ', ');\n\n //publicationDate\n let publicationDate = shared.getFullDate(refData.publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n }\n\n if (type == 'episode') {\n //Secondary Contribs\n let secondaryContributor = getEpisodeContainerOneContribs(refData.contributors);\n container1 = container1.appendData(secondaryContributor, ', ');\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if (type == 'episode') {\n // title, executive directors & executive producers, season, episode, publishers, publicationDate.\n\n //title\n let title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.italicize();\n }\n \n container2 = container2.appendData(title, '');\n }\n\n //exec directors and producers\n let secondaryContributor = getEpisodeContainerTwoContribs(refData.contributors);\n container2 = container2.appendData(secondaryContributor, ', ');\n\n //season\n let season = shared.getStringValue(refData.seasonNumber);\n container2 = container2.appendData(season, ', ', 'season');\n\n //episode\n let episode = shared.getStringValue(refData.episodeNumber);\n container2 = container2.appendData(episode, ', ', 'episode');\n\n //Publishers\n let publisherString = shared.getPublisherString(refData.publishers);\n container2 = container2.appendData(publisherString, ', ');\n\n //publicationDate\n let publicationDate = shared.getFullDate(refData.publicationDate);\n container2 = container2.appendData(publicationDate, ', ');\n }\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n //platform\n let platform = shared.getStringValue(refData.platform);\n \n if (platform.length > 0) {\n platform = platform.italicize();\n secondSupplemental = secondSupplemental.appendData(platform, ', ');\n }\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}\n\n//this is so one off, we are just going to use these locally\nfunction getSecondaryContributorString(contributors){\n\n let contributorstring = '';\n\n if (typeof contributors === 'undefined') {\n return contributorstring;\n }\n\n if (contributors.length > 0) {\n //for these contributors, get all non custom\n let secondaryContributors = []; \n\t\t_forEach(contributors, (contrib) => {\n if (contrib.type != 'custom') {\n secondaryContributors.push(contrib);\n }\n });\n\n if (secondaryContributors.length > 0) {\n\n //take one pass and pull each unique contrib types we have\n let contribTypes = [];\n let typeStrings = [];\n\n\t\t\t_forEach(secondaryContributors, (contrib) => {\n if (contrib.type.length > 0) {\n \n let alreadyInList = false;\n\n contribTypes.forEach(contribType => {\n if (contrib.type == contribType) {\n alreadyInList = true;\n }\n });\n\n if (!alreadyInList) {\n contribTypes.push(contrib.type);\n }\n }\n });\n\n //add each type into it's own list\n contribTypes.forEach(contribType => {\n let contribsByType = [];\n\n _forEach(secondaryContributors, (contrib) => {\n if (contrib.type == contribType) {\n contribsByType.push(contrib);\n }\n });\n\n let typeString = shared.getSecondaryContributorTypeString(contribsByType, contribType);\n typeStrings.push(typeString);\n });\n\n typeStrings.forEach(typeString => {\n if (contributorstring.length > 0) {\n contributorstring = contributorstring + \", \"\n }\n\n contributorstring = contributorstring + typeString;\n });\n }\n\n }\n\n return contributorstring;\n}\n\nfunction getEpisodeContainerOneContribs(contributors){\n let contributorstring = '';\n\n if (typeof contributors === 'undefined') {\n return contributorstring;\n }\n\n if (contributors.length > 0) {\n //directors, writers, writers & directors.\n let directors = shared.getContributorsByType('director', contributors);\n let writers = shared.getContributorsByType('writer', contributors);\n let writerDirectors = shared.getContributorsByType('writerDirector', contributors);\n\n if (directors.length > 0 || writers.length > 0 || writerDirectors.length > 0) {\n \n //see if we need to \"flatten\" writer and directors\n if (writerDirectors.length > 0) {\n if (directors.length > 0 || writers.length > 0) {\n \n //we need to get order they were entered correctly, so let's recreate these arrays as listed\n directors = [];\n writers = [];\n writerDirectors = [];\n\n\t\t\t\t\t_forEach(contributors, (contributor) => {\n switch (contributor.type) {\n case 'director':\n directors.push(contributor);\n break;\n case 'writer':\n writers.push(contributor);\n break;\n case 'writerDirector':\n directors.push(contributor);\n writers.push(contributor);\n break;\n }\n });\n }\n }\n\n let typeStrings = [];\n\n //directors\n if (directors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(directors, 'director'));\n }\n\n //writers\n if (writers.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(writers, 'writer'));\n }\n\n //writerDirectors\n if (writerDirectors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(writerDirectors, 'writerDirector'));\n }\n\n //now build out our strings\n if (typeStrings.length > 0) {\n \n let counter = 0;\n typeStrings.forEach(item => {\n\n if (counter == 0) {\n contributorstring = item;\n }\n else{\n contributorstring = contributorstring + ', ' + item;\n }\n \n counter++;\n });\n }\n \n }\n\n }\n\n return contributorstring;\n}\n\nfunction getEpisodeContainerTwoContribs(contributors){\n let contributorstring = '';\n\n if (typeof contributors === 'undefined') {\n return contributorstring;\n }\n\n if (contributors.length > 0) {\n\n let executiveDirectors = shared.getContributorsByType('executiveDirector', contributors);\n let executiveProducers = shared.getContributorsByType('executiveProducer', contributors);\n let executiveDirectorProducers = shared.getContributorsByType('executiveDirectorProducer', contributors);\n\n if (executiveDirectors.length > 0 || executiveProducers.length > 0 || executiveDirectorProducers.length > 0) {\n let typeStrings = [];\n\n if (executiveDirectors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(executiveDirectors, 'executiveDirector'));\n }\n\n if (executiveProducers.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(executiveProducers, 'executiveProducer'));\n }\n\n if (executiveDirectorProducers.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(executiveDirectorProducers, 'executiveDirectorProducer'));\n }\n\n //now build out our strings\n if (typeStrings.length > 0) {\n \n let counter = 0;\n typeStrings.forEach(item => {\n\n if (counter == 0) {\n contributorstring = item;\n }\n else{\n contributorstring = contributorstring + ', ' + item;\n }\n \n counter++;\n });\n }\n }\n }\n\n return contributorstring;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n let primaryContributor = 'United States';\n\n let committeeName = shared.getStringValue(refData.committeeName);\n let title = shared.getStringValue(refData.title);\n\n if (kind == '' && committeeName == '' && title.length > 0) {\n let isSecondaryTitle = true;\n let titleProperty = 'title';\n\n let fakeRefData = new Object();\n fakeRefData.title = refData.title;\n fakeRefData.contributors = [];\n \n primaryContributor = shared.getPrimaryContributorCitationString(fakeRefData, titleProperty, isSecondaryTitle);\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n switch (kind) {\n case 'house':\n primaryPart = 'United States, Congress, House';\n break;\n case 'senate':\n primaryPart = 'United States, Congress, Senate';\n break;\n case '':\n primaryPart = 'United States, Congress';\n break;\n }\n\n let committeeName = shared.getStringValue(refData.committeeName);\n committeeName = committeeName.replaceAmpersand();\n primaryPart = primaryPart.appendData(committeeName, ', ', '', '');\n\n primaryPart = shared.fixClosure(primaryPart);\n\n let title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.italicize();\n }\n\n primaryPart = primaryPart.appendData(title, ' ');\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n switch (type) {\n case 'testimony':\n \n let session = shared.getStringValue(refData.session);\n\n if (session.length > 0) {\n session = shared.getOrdinalValue(session);\n container1 = container1.appendData(session, ', ', '', 'Congress');\n }\n\n //Secondary Contribs\n let secondaryContributor = getSecondaryContributorString(refData.contributors);\n container1 = container1.appendData(secondaryContributor, ', ');\n\n break;\n case 'hearing':\n \n container1 = container1.appendData('U.S. Government Publishing Office', ', ');\n \n break;\n }\n\n //publicationDate\n let publicationDate = shared.getFullDate(refData.publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}\n\nfunction getSecondaryContributorString(contributors){\n\n let contributorstring = '';\n\n if (typeof contributors === 'undefined') {\n return contributorstring;\n }\n\n if (contributors.length > 0) {\n //for these contributors, get them all - authors (which includes group authors and user names)\n let secondaryContributors = contributors; \n \n if (secondaryContributors.length > 0) {\n\n let typeStrings = [];\n\n let testimonies = shared.getContributorsByType('testimony', secondaryContributors);\n\n if (testimonies.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(testimonies, 'testimony'));\n }\n\n typeStrings.forEach(typeString => {\n if (contributorstring.length > 0) {\n contributorstring = contributorstring + \", \"\n }\n\n contributorstring = contributorstring + typeString;\n });\n }\n\n }\n\n return contributorstring;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let title = shared.getStringValue(refData.title);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t}\n\t\telse{\n title = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t\ttitle = title.italicize();\n\t\t}\n\t}\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any first supplemental data needed\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n //Secondary Contribs\n let secondaryContributor = shared.getSecondaryContributorString(refData.contributors);\n container1 = container1.appendData(secondaryContributor, ', ');\n\n\t//number\n let number = shared.getStringValue(refData.number);\n container1 = container1.appendData(number, ', ');\n\n\t//Publishers\n let publisherString = shared.getPublisherString(refData.publishers);\n container1 = container1.appendData(publisherString, ', ');\n\n\t//publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n //url\n let url = shared.getStringValue(refData.url);\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n\n //do not upper the the first letter if we start with a publisher\n if (publisherString == '') {\n container1 = container1.upperFirstLetter();\n }\n else{\n if (!container1.startsWith(publisherString)) {\n container1 = container1.upperFirstLetter();\n }\n }\n \n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any container data needed\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n\tif(type === 'record'){\n\t\tsecondSupplemental = 'Database record'\n\t}\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'title';\n let isSecondaryTitle = false;\n let noTitleFormatting = true;\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let primaryContributor = shared.getPrimaryContributorCitationString(refData, titleProperty, isSecondaryTitle, noTitleFormatting);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n primaryPart = primaryContributor;\n\n let title = shared.getStringValue(refData.title);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t}\n\t\telse{\n title = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t}\n\t}\n\n if (title.length > 0) {\n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n\t//publicationDate\n\tlet publicationDate = shared.getStringValue(refData.publicationDate);\n\tpublicationDate = shared.getFullDate(publicationDate);\n\tcontainer1 = container1.appendData(publicationDate, ', ');\n \n\t//url\n\tlet url = shared.getStringValue(refData.url);\n\n\tif (url.length > 0) {\n\t\turl = shared.formatURL(url);\n\t\tcontainer1 = container1.appendData(url, ', ');\n\t}\n\t\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n\tcontainer2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = 'United States';\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n let type = shared.getStringValue(refData.type);\n let primaryContributor = 'United States';\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n let type = shared.getStringValue(refData.type);\n\n switch (type) {\n case 'supreme':\n primaryPart = 'United States, Supreme Court.';\n break;\n case 'circuit':\n let circuit = shared.getStringValue(refData.circuit);\n\n if (circuit.length > 0) {\n let circuitConverted = shared.ordinalToWord(circuit);\n primaryPart = 'United States, Court of Appeals for ' + circuitConverted + ' Circuit.';\n }\n else{\n primaryPart = 'United States, Court of Appeals for Circuit.';\n }\n\n break;\n case 'district':\n let district = shared.getStringValue(refData.district);\n\n if (district.length > 0) {\n let districtConverted = districtAbbreviationToFull(district);\n primaryPart = 'United States, ' + districtConverted + '.';\n }\n else{\n primaryPart = 'United States, District Court.';\n }\n\n break;\n case 'appealed':\n\n let appealCircuit = shared.getStringValue(refData.appealCircuit);\n\n if (appealCircuit.length > 0) {\n let circuitConverted = shared.ordinalToWord(appealCircuit);\n primaryPart = 'United States, Court of Appeals for ' + circuitConverted + ' Circuit.';\n }\n else{\n primaryPart = 'United States, Court of Appeals for Circuit.';\n }\n\n break;\n }\n\n let title = shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.italicize();\n }\n\n primaryPart = primaryPart.appendData(title, ' ');\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let label = '';\n let series = shared.getStringValue(refData.series);\n\n switch (type) {\n case 'supreme':\n label = 'United States Reports';\n break;\n case 'circuit':\n if (series.length > 0) {\n series = series.upperFirstLetter();\n label = 'Federal Reporter, ' + series + ' Series';\n }\n else{\n label = 'Federal Reporter';\n }\n break;\n case 'district':\n\n if (series.length > 0) {\n series = series.upperFirstLetter();\n label = 'Federal Supplement, ' + series + ' Series';\n }\n else{\n label = 'Federal Supplement';\n }\n break;\n case 'appealed':\n\n let appealSeries = shared.getStringValue(refData.appealSeries);\n\n if (appealSeries.length > 0) {\n appealSeries = appealSeries.upperFirstLetter();\n label = 'Federal Reporter, ' + appealSeries + ' Series';\n }\n else{\n label = 'Federal Reporter';\n }\n\n break;\n }\n\n container1 = container1.appendData(label, ', ');\n\n if (type == 'appealed') {\n //volume\n let appealVolume = shared.getStringValue(refData.appealVolume);\n container1 = container1.appendData(appealVolume, ', ', 'vol.', '');\n\n //publicationDate\n let appealDate = shared.getMonthYear(refData.appealDate);\n container1 = container1.appendData(appealDate, ', ');\n\n //pageNumber\n let appealPageNumber = shared.getStringValue(refData.appealPageNumber);\n appealPageNumber = shared.formatPageNumbers(appealPageNumber);\n container1 = container1.appendData(appealPageNumber, ', '); \n }\n else{\n //volume\n let volume = shared.getStringValue(refData.volume);\n container1 = container1.appendData(volume, ', ', 'vol.', '');\n\n //publicationDate\n let publicationDate = shared.getMonthYear(refData.publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n //pageNumber\n let pageNumber = shared.getStringValue(refData.pageNumber);\n pageNumber = shared.formatPageNumbers(pageNumber);\n container1 = container1.appendData(pageNumber, ', ');\n }\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container1 = container1.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}\n\n//District Court Abbreviations\n//https://abbreviations.yourdictionary.com/articles/federal-and-district-court-abbreviations.html\nfunction districtAbbreviationToFull(abbreviation){\n //APA is entered in abbreviations...if they entered and abbreviation...convert it\n\n let word = '';\n\n var conversions = [\n ['D. Conn.', 'District of Connecticut'],\n ['D. Mass.', 'District of Massachusetts'],\n ['D. Me.', 'District of Maine'],\n ['D.N.J.', 'District of New Jersey'],\n ['D.N.H.', 'District of New Hampshire'],\n ['E.D.N.Y.', 'Eastern District of New York'],\n ['N.D.N.Y.', 'Northern District of New York'],\n ['S.D.N.Y.', 'Southern District of New York'],\n ['W.D.N.Y.', 'Western District of New York'],\n ['E.D. Pa.', 'Eastern District of Pennsylvania'],\n ['M.D. Pa.', 'Middle District of Pennsylvania'],\n ['W.D. Pa', ' Western District of Pennsylvania'],\n ['D.R.I.', 'District of Rhode Island'],\n ['D. Vt.', 'District of Vermont'],\n ['C.D. Ill.', 'Central District of Illinois'],\n ['N.D. Ill', 'Northern District of Illinois'],\n ['N.D. Ind', 'Northern District of Indiana'],\n ['S.D. Ind.', 'Southern District of Indiana'],\n ['N.D. Iowa', 'Northern District of Iowa'],\n ['S.D. Iowa ', 'Southern District of Iowa'],\n ['D. Kan.', 'District of Kansas'],\n ['E.D. Mich.', 'Eastern District of Michigan'],\n ['W.D. Mich.', 'Western District of Michigan'],\n ['D. Minn.', 'District of Minnesota'],\n ['E.D. Mo', 'Eastern District of Missouri'],\n ['W.D. Mo.', 'Western District of Missouri'],\n ['D. Neb.', 'District of Nebraska'],\n ['D.N.D.', 'District of North Dakota'],\n ['N.D. Ohio', 'Northern District of Ohio'],\n ['S.D. Ohio', 'Southern District of Ohio'],\n ['D.S.D.', 'District of South Dakota'],\n ['E.D. Wis', 'Eastern District of Wisconsin'],\n ['W.D. Wis.', 'Western District of Wisconsin'],\n ['M.D. Ala.', 'Middle District of Alabama'],\n ['N.D. Ala.', 'Northern District of Alabama'],\n ['S.D. Ala.', 'Southern District of Alabama'],\n ['E.D. Ark.', 'Eastern District of Arkansas'],\n ['W.D. Ark.', 'Western District of Arkansas'],\n ['D. Del.', 'District of Delaware'],\n ['D.D.C.', 'District of D.C.'],\n ['M.D. Fla.', 'Middle District of Florida'],\n ['N.D. Fla.', 'Northern District of Florida'],\n ['S.D. Fla.', 'Southern District of Florida'],\n ['M.D. Ga.', 'Middle District of Georgia'],\n ['N.D. Ga.', 'Northern District of Georgia'],\n ['S.D. Ga.', 'Southern District of Georgia'],\n ['E.D. Ky.', 'Eastern District of Kentucky'],\n ['W.D. Ky.', 'Western District of Kentucky'],\n ['E.D. La.', 'Eastern District of Louisiana'],\n ['M.D. La.', 'Middle District of Louisiana'],\n ['W.D. La.', 'Western District of Louisiana'],\n ['D. Md.', 'District of Maryland'],\n ['N.D. Miss.', 'Northern District of Mississippi'],\n ['S.D. Miss.', 'Southern District of Mississippi'],\n ['E.D.N.C.', 'Eastern District of North Carolina'],\n ['M.D.N.C.', 'Middle District of North Carolina'],\n ['W.D.N.C.', 'Western District of North Carolina'],\n ['E.D. Okla.', 'Eastern District of Oklahoma'],\n ['N.D. Okla.', 'Northern District of Oklahoma'],\n ['W.D. Okla.', 'Western District of Oklahoma'],\n ['D.S.C.', 'District of South Carolina'],\n ['E.D. Tenn.', 'Eastern District of Tennessee'],\n ['M.D. Tenn.', 'Middle District of Tennessee'],\n ['W.D. Tenn.', 'Western District of Tennessee'],\n ['E.D. Tex.', 'Eastern District of Texas'],\n ['N.D. Tex.', 'Northern District of Texas'],\n ['S.D. Tex.', 'Southern District of Texas'],\n ['W.D. Tex.', 'Western District of Texas'],\n ['E.D. Va.', 'Eastern District of Virginia'],\n ['W.D. Va.', 'Western District of Virginia'],\n ['N.D.W. Va.', 'Northern District of West Virginia'],\n ['S.D.W. Va.', 'Southern District of West Virginia'],\n ['D. Alaska', 'District of Alaska'],\n ['D. Ariz.', 'District of Arizona'],\n ['C.D. Cal.', 'Central District of California'],\n ['E.D. Cal.', 'Eastern District of California'],\n ['N.D. Cal.', 'Northern District of California'],\n ['S.D. Cal.', 'Southern District of California'],\n ['D. Colo.', 'District of Colorado'],\n ['D. Guam', 'District of Guam'],\n ['D. Haw.', 'District of Hawaii'],\n ['D. Idaho', 'District of Idaho'],\n ['D. Mont.', 'District of Montana'],\n ['D. Nev.', 'District of Nevada'],\n ['D.N.M.', 'District of New Mexico'],\n ['D.N. Mar. Is.', 'District of the Northern Mariana Islands'],\n ['D. Or.', 'District of Oregon'],\n ['D.P.R.', 'District of Puerto Rico'],\n ['D. Utah', 'District of Utah'],\n ['D.V.I.', 'District of the Virgin Islands'],\n ['E.D. Wash.', 'Eastern District of Washington'],\n ['W.D. Wash.', 'Western District of Washington'],\n ['D. Wyo.', 'District of Wyoming'],\n ['D. Tenn.', 'District Court for Tennessee']\n ];\n\n\n for (let index = 0; index < conversions.length; index++) {\n let thisConversion = conversions[index][0];\n\n if (thisConversion.toLowerCase() == abbreviation.toLowerCase()) {\n word = conversions[index][1];\n }\n } \n\n if (word == '') {\n //if we havent converted yet, just leave it as is\n word = abbreviation;\n }\n\n return word;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.court);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n let titleProperty = 'court';\n let isSecondaryTitle = false;\n let noFormatting = true;\n\n //court\n let court = shared.getStringValue(refData.court);\n court = courtAbbreviationToFull(court);\n\n var array = court.split(\",\");\n\n if (array.length > 1) {\n court = array[0].trim();\n }\n\n let title= shared.getStringValue(refData.title);\n \n if (court.length == 0) {\n\n if (title.length > 0) {\n array = title.split(\"v.\");\n\n if (array.length > 1) {\n title = array[0].trim();\n }\n \n titleProperty = 'title';\n isSecondaryTitle = false;\n noFormatting = false;\n }\n }\n\n let fakeRefData = new Object();\n fakeRefData.court = court;\n fakeRefData.title = title;\n fakeRefData.contributors = []; //contribs arent listed in the citation here\n\n let primaryContributor = shared.getPrimaryContributorCitationString(fakeRefData, titleProperty, isSecondaryTitle, noFormatting);\n let citation = shared.getCitations(citationData, primaryContributor);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n //court\n let court = shared.getStringValue(refData.court);\n court = courtAbbreviationToFull(court);\n primaryPart = primaryPart.appendData(court, ', ', '', '');\n\n let title= shared.getStringValue(refData.title);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.italicize();\n }\n\n primaryPart = primaryPart.appendData(title, '. ', '', '');\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let citations = getCitationString(refData.citation);\n container2 = container2.appendData(citations, ', ');\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n container2 = container2.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url);\n container2 = container2.appendData(url, ', ');\n }\n }\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}\n\nfunction getCitationString(citations){\n var citationString = '';\n\n if (typeof citations === 'undefined') {\n return citationString;\n }\n\n if (citations.length > 0) {\n\n //MLA only uses the first one\n //[citation.series], vol. [citation.volume], p. [citation.pageNumber]\n\n let citation = citations[0];\n\n let volume = shared.getStringValue(citation.volume);\n let series = shared.getStringValue(citation.series);\n let pageNumber = shared.getStringValue(citation.pageNumber);\n\n if (series.length > 0) {\n series = seriesAbbreviationToFull(series);\n series = series.italicize();\n citationString = citationString.appendData(series, ', ');\n }\n\n if (volume.length > 0) {\n citationString = citationString.appendData(volume, ', ', 'vol.');\n }\n\n if (pageNumber.length > 0) {\n pageNumber = shared.formatPageNumbers(pageNumber);\n citationString = citationString.appendData(pageNumber, ', ');\n }\n\n }\n\n return citationString;\n}\n\nfunction courtAbbreviationToFull(abbreviation){\n //APA is entered in abbreviations...if they entered and abbreviation...convert it\n\n let word = '';\n\n var conversions = [\n [\"Alabama State, Supreme Court\", \"Ala.\"],\n [\"Alabama State, Court of Civil Appeals\", \"Ala. Civ. App.\"],\n [\"Alabama State, Court of Criminal Appeals\", \"Ala. Crim. App.\"],\n [\"Alaska State, Supreme Cout\", \"Alaska\"],\n [\"Alaska State, Court of Appeals\", \"Alaska Ct. App.\"],\n [\"Arizona State, Surpreme Courts\", \"Ariz.\"],\n [\"Arizona State, Court of Appeals\", \"Ariz. Ct. App.\"],\n [\"Arkansas State, Supreme Court\", \"Ark.\"],\n [\"Arkansas State, Court of Appeals\", \"Ark. Ct. App.\"],\n [\"California State, Supreme Court\", \"Cal.\"],\n [\"California State, Court of Appeal\", \"Cal. Ct. App.\"],\n [\"Colorado State, Supreme Court\", \"Colo.\"],\n [\"Colorado State, Court of Appeals\", \"Colo. App.\"],\n [\"Connecticut State, Supreme Court\", \"Conn.\"],\n [\"Connecticut State, Appellate Court\", \"Conn. App. Ct.\"],\n [\"Delaware State, Supreme Court\", \"Del.\"],\n [\"Delaware State, Court of Chancery\", \"Del. Ch.\"],\n [\"District of Columbia Court of Appeals\", \"D.C.\"],\n [\"Florida State, Supreme Court\", \"Fla.\"],\n [\"Florida State, District Court of Appeal\", \"Fla. Dist. Ct. App.\"],\n [\"Georgia State, Supreme Court\", \"Ga.\"],\n [\"Georgia State, Court of Appeals\", \"Ga. Ct. App.\"],\n [\"Hawaii State, Supreme Court\", \"Haw.\"],\n [\"Hawaii State, Court of Appeals\", \"Haw. Ct. App.\"],\n [\"Idaho State, Supreme Court\", \"Idaho\"],\n [\"Idaho State, Court of Appeals\", \"Idaho Ct. App.\"],\n [\"Illinois State, Supreme Court\", \"Ill.\"],\n [\"Illinois State, Appellate Court\", \"Ill. App. Ct.\"],\n [\"Indiana State, Supreme Court\", \"Ind.\"],\n [\"Indiana State, Court of Appeals\", \"Ind. Ct. App.\"],\n [\"Iowa State, Supreme Court\", \"Iowa\"],\n [\"Iowa State, Court of Appeals\", \"Iowa Ct. App.\"],\n [\"Kansas State, Supreme Court\", \"Kan.\"],\n [\"Kansas State, Court of Appeals\", \"Kan. Ct. App.\"],\n [\"Kentucky State, Supreme Court\", \"Ky.\"],\n [\"Kentucky State, Court of Appeals\", \"Ky. Ct. App.\"],\n [\"Louisiana State, Supreme Court\", \"La.\"],\n [\"Louisiana State, Court of Appeal\", \"La. Ct. App.\"],\n [\"Maine State, Supreme Court\", \"Me.\"],\n [\"Maryland State, Supreme Court\", \"Md.\"],\n [\"Maryland State, Court of Special Appeals\", \"Md. Ct. Spec. App.\"],\n [\"Massachusetts State, Supreme Judicial Court\", \"Mass.\"],\n [\"Massachusetts State, Appeals Court\", \"Mass. App. Ct.\"],\n [\"Michigan State, Supreme Court\", \"Mich.\"],\n [\"Michigan State, Court of Appeals\", \"Mich. Ct. App.\"],\n [\"Minnesota State, Supreme Court\", \"Minn.\"],\n [\"Minnesota State, Court of Appeals\", \"Minn. Ct. App.\"],\n [\"Mississippi State, Supreme Court\", \"Miss.\"],\n [\"Mississippi State, Court of Appeals\", \"Miss. Ct. App.\"],\n [\"Missouri State, Supreme Court\", \"Mo.\"],\n [\"Missouri State, Court of Appeals\", \"Mo. Ct. App.\"],\n [\"Montana State, Supreme Court\", \"Mont.\"],\n [\"Nebraska State, Supreme Court\", \"Neb.\"],\n [\"Nebraska State, Court of Appeals\", \"Neb. Ct. App.\"],\n [\"Nevada State, Supreme Court\", \"Nev,\"],\n [\"New Hampshire State, Supreme Court\", \"N.H.\"],\n [\"New Jersey State, Supreme Court\", \"N.J.\"],\n [\"New Jersey State, Superior Court, Appellate Divsion\", \"N.J. Super. Ct. App. Div.\"],\n [\"New Mexico State, Supreme Court\", \"N.M.\"],\n [\"New Mexico State, Court of Appeals\", \"N.M. Ct. App.\"],\n [\"New York State, Court of Appeals\", \"N.Y.\"],\n [\"New York State, Supreme Court, Appellate Division\", \"N.Y. App. Div.\"],\n [\"North Carolina State, Supreme Court\", \"N.C.\"],\n [\"North Carolina State, Court of Appeals\", \"N.C. Ct. App.\"],\n [\"North Dakota State, Supreme Court\", \"N.D.\"],\n [\"Court of Appeals of North Dakota\", \"N.D. Ct. App.\"],\n [\"Ohio State, Supreme Court\", \"Ohio\"],\n [\"Ohio State, Court of Appeals\", \"Ohio Ct. App.\"],\n [\"Oklahoma State, Supreme Court\", \"Okla.\"],\n [\"Oklahoma State, Court of Criminal Appeals\", \"Okla. Crim. App.\"],\n [\"Oklahoma State, Court of Civil Appeals\", \"Okla. Civ. App.\"],\n [\"Oregon State, Supreme Court\", \"Or.\"],\n [\"Oregon State, Court of Appeals\", \"Or. Ct. App.\"],\n [\"Pennsylvania State, Supreme Court\", \"Pa.\"],\n [\"Pennsylvania State, Superior Court\", \"Pa. Super. Ct.\"],\n [\"Rhode Island State, Supreme Court\", \"R.I.\"],\n [\"South Carolina State, Supreme Court\", \"S.C.\"],\n [\"South Carolina State, Court of Appeals\", \"S.C. Ct. App.\"],\n [\"South Dakota State, Supreme Court\", \"S.D.\"],\n [\"Tennessee State, Supreme Court\", \"Tenn.\"],\n [\"Tennessee State, Court of Appeals\", \"Tenn. Ct. App.\"],\n [\"Texas State, Supreme Court\", \"Tex.\"],\n [\"Texas State, Court of Criminal Appeals\", \"Tex. Crim. App.\"],\n [\"Texas State, Court of Appeals\", \"Tex. App.\"],\n [\"Texas State, Court of Appeals\", \"Tex. Ct. App.\"],\n [\"Utah State, Supreme Court\", \"Utah\"],\n [\"Utah State, Court of Appeals\", \"Utah Ct. App.\"],\n [\"Vermont State, Supreme Court\", \"Vt.\"],\n [\"Virginia State, Supreme Court\", \"Va.\"],\n [\"Virginia State, Court of Appeals\", \"Va. Ct. App.\"],\n [\"Washington State, Supreme Court\", \"Wash.\"],\n [\"Washington State, Court of Appeals\", \"Wash. Ct. App.\"],\n [\"West Virginia State, Supreme Court of Appeals\", \"W. Va.\"],\n [\"Wisconsin State, Supreme Court\", \"Wis.\"],\n [\"Wisconsin State, Court of Appeals\", \"Wis. Ct. App.\"],\n [\"Wyoming State, Supreme Court\", \"Wyo.\"]\n ];\n\n for (let index = 0; index < conversions.length; index++) {\n let thisConversion = conversions[index][1];\n\n if (thisConversion.toLowerCase() == abbreviation.toLowerCase()) {\n word = conversions[index][0];\n }\n } \n\n if (word == '') {\n //if we havent converted yet, just leave it as is\n word = abbreviation;\n }\n\n return word;\n}\n\nfunction seriesAbbreviationToFull(abbreviation){\n //APA is entered in abbreviations...if they entered and abbreviation...convert it\n\n let word = '';\n\n var conversions = [\n ['A.', 'Atlantic Reporter'],\n ['A.2d', 'Atlantic Reporter, Second Series'],\n ['Cal. Rptr.', 'California Reporter'],\n ['Cal. Rptr. 2d', 'California Reporter, Second Series'],\n ['N.Y.S.', 'New York Supplement'],\n ['N.Y.S.2d', 'New York Supplement, Second Series'],\n ['N.E.', 'North Eastern Reporter'],\n ['N.E.2d', 'North Eastern Reporter, Second Series'],\n ['N.W.', 'North Western Reporter'],\n ['N.W.2d', 'North Western Reporter, Second Series'],\n ['P.', 'Pacific Reporter'],\n ['P.2d', 'Pacific Reporter, Second Series'],\n ['P.3d', 'Pacific Reporter, Third Series'],\n ['S.E.', 'South Eastern Reporter'],\n ['S.E.2d', 'South Eastern Reporter, Second Series'],\n ['So.', 'Southern Reporter'],\n ['So.2d', 'Southern Reporter, Second Series'],\n ['S.W.', 'South Western Reporter'],\n ['S.W.2d', 'South Western Reporter, Second Series'],\n ['S.W. 3d', 'South Western Reporter, Third Series']\n ];\n\n for (let index = 0; index < conversions.length; index++) {\n let thisConversion = conversions[index][0];\n\n if (thisConversion.toLowerCase() == abbreviation.toLowerCase()) {\n word = conversions[index][1];\n }\n } \n\n if (word == '') {\n //if we havent converted yet, just leave it as is\n word = abbreviation;\n }\n\n return word;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let type = shared.getStringValue(refData.type);\n let titleProperty = 'title';\n let isSecondaryTitle = true;\n\n let title = shared.getStringValue(refData.title);\n let fakeTitle = '';\n\n if (title.length > 0) {\n fakeTitle = title;\n }\n else{\n let description = shared.getStringValue(refData.description);\n\n if (description.length > 0) {\n fakeTitle = description.bracket();\n }\n }\n\n let fakeRefData = new Object();\n fakeRefData.title = fakeTitle;\n\n if(type === 'webinar'){\n fakeRefData.contributors = refData.contributors;\n }\n else{\n fakeRefData.contributors = []; //contribs arent listed in the citation here\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n \n let primaryContributor = shared.getPrimaryContributorCitationString(fakeRefData, titleProperty, isSecondaryTitle);\n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n \n\tlet type = shared.getStringValue(refData.type);\n\tlet title;\n\n\tif(type === 'webinar'){\n\t\tlet primaryContributor = shared.getPrimaryContributorString(refData);\n\t\tprimaryPart = primaryContributor;\n\t}\n\n\ttitle = shared.getStringValue(refData.title);\n\n\tif (title.length > 0) {\n\t\t//if this is a description, remove the brackets and don't italicize\n\t\tif (title.startsWith('[')) {\n\t\t\ttitle = shared.removeDescriptionFromTitle(title);\n\t\t} else{\n title = title.replaceAmpersand();\n\t\t\ttitle = title.toTitleCase();\n\t\t\tif(type === 'streaming'){\n\t\t\t\ttitle = title.doubleQuote();\n\t\t\t}\n\t\t}\n\t}\n\n if (title.length > 0) {\n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n } else{\n primaryPart = title;\n }\n }\n else{\n let description = shared.getStringValue(refData.description);\n\n primaryPart = description;\n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n\tlet type = shared.getStringValue(refData.type);\n\n\t//Publishers\n let pubsItalics = true;\n\n if(type === 'webinar'){\n pubsItalics = false;\n }\n\n let publisherString = shared.getPublisherString(refData.publishers, 'reference', pubsItalics);\n\tif(publisherString.length > 0){\n\t\tcontainer1 = container1.appendData(publisherString, ', ');\n\t}\n\n\t//contributors\n\tif(type === 'streaming'){\n\t\tlet primaryContributor = getSecondaryContributorString(refData.contributors);\n\t\tif(primaryContributor.length > 0){\n\n //do not add this if it is the same as the publisher\n let unformattedPublishers = shared.getPublisherString(refData.publishers);\n \n if (primaryContributor != 'by ' + unformattedPublishers) {\n container1 = container1.appendData(primaryContributor, ', ', 'uploaded');\n }\n\t\t}\n\t}\n\n\t//publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n\t//url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n\t\turl = shared.formatURL(url);\n\t\tcontainer1 = container1.appendData(url, ', ');\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //TODO: add any container data needed\n\n container2 = container2.upperFirstLetter();\n container2 = shared.fixClosure(container2);\n\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n \n\tif(type === 'webinar'){\n\t\t// webinar doesn't get a 2ndSup if the title is used as the description\n\t\tlet title = shared.getStringValue(refData.title);\n\t\tif (title.length > 0 && !title.startsWith('[')) {\n\t\t\tsecondSupplemental = 'Webinar';\t\t\n\t\t}\n\t}\n\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n\n return secondSupplemental;\n}\n\n//doing this as a one off since this is where all contributors go for this type\nfunction getSecondaryContributorString(contributors){\n\n let contributorstring = '';\n\n if (typeof contributors === 'undefined') {\n return contributorstring;\n }\n\n if (contributors.length > 0) {\n //for these contributors, get them all - authors (which includes group authors and user names)\n let secondaryContributors = contributors; \n \n if (secondaryContributors.length > 0) {\n\n let typeStrings = [];\n\n let authors = shared.getContributorsByType('author', secondaryContributors);\n\n if (authors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(authors, 'author'));\n }\n\n typeStrings.forEach(typeString => {\n if (contributorstring.length > 0) {\n contributorstring = contributorstring + \", \"\n }\n\n contributorstring = contributorstring + typeString;\n });\n }\n\n }\n\n return contributorstring;\n}","const shared = require('./MLA9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n let containerOne = getContainerOne(refData);\n let containerTwo = getContainerTwo(refData);\n let secondSupplemental = getSecondSupplemental(refData);\n\n let referenceValue = primaryInfo;\n\n if (firstSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + firstSupplemental;\n }\n\n if (containerOne.length > 0) {\n referenceValue = referenceValue + ' ' + containerOne;\n }\n\n if (containerTwo.length > 0) {\n referenceValue = referenceValue + ' ' + containerTwo;\n }\n\n if (secondSupplemental.length > 0) {\n referenceValue = referenceValue + ' ' + secondSupplemental;\n }\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let reference = {\n authorPart: primaryContributor,\n authorPartNoLabel : shared.getPrimaryContributorString(refData, true),\n authorPartSort: shared.getPrimaryContributorSort(refData),\n citationTitle : citationTitle,\n citationDate : citationDate,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.pageTitle);\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitationDate(refData){\n\n let citationDate = '';\n\n citationDate = shared.getStringValue(refData.publicationDate);\n\n return citationDate;\n}\n\nfunction getCitation(refData, citationData) {\n //define our citation logic for this type here\n let titleProperty = 'pageTitle';\n let isSecondaryTitle = false;\n\n let primaryReferenceContributor = shared.getPrimaryContributorString(refData);\n\n //if the website title is the same as the primaryContributor, then we will use this later in the ref instead\n let websiteTitle = shared.getStringValue(refData.websiteTitle.replaceAll(\"’\", \"'\"));\n let citationRefData = JSON.parse(JSON.stringify(refData));\n if (websiteTitle.replaceAll(\"’\", \"'\") + '.' == primaryReferenceContributor.replaceAll(\"’\", \"'\")) {\n citationRefData.contributors = [];\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationDate = getCitationDate(refData);\n\n let primaryContributor = shared.getPrimaryContributorCitationString(citationRefData, titleProperty, isSecondaryTitle);\n \n let citation = shared.getCitations(citationData, primaryContributor, citationTitle, citationDate);\n\n //Test 54...odd scenario\n //if we don't have any other information here, check the pub date\n if (citation.first.length == 0 && citationData.namePart == 'true') {\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n\n citation.first = publicationDate;\n }\n\n return citation;\n}\n\nfunction getPrimaryInformation(refData){\n let primaryPart = '';\n\n let primaryContributor = shared.getPrimaryContributorString(refData);\n\n //if the website title is the same as the primaryContributor, then we will use this later in the ref instead\n let websiteTitle = shared.getStringValue(refData.websiteTitle);\n if (websiteTitle.replaceAll(\"’\", \"'\") + '.' == primaryContributor.replaceAll(\"’\", \"'\")) {\n primaryContributor = '';\n }\n\n primaryPart = primaryContributor;\n\n let type = shared.getStringValue(refData.type);\n\n let title = '';\n\n title = shared.getStringValue(refData.pageTitle);\n\n if (title.length > 0) {\n //if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n else{\n title = title.replaceAmpersand();\n title = title.toTitleCase();\n title = title.italicize();\n }\n }\n\n if (title.length > 0) {\n \n if (primaryPart.length > 0) {\n primaryPart = primaryPart + ' ' + title;\n }\n else{\n primaryPart = title;\n }\n }\n\n //translatedTitle\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (translatedTitle.length > 0) {\n translatedTitle = translatedTitle.replaceAmpersand();\n translatedTitle = translatedTitle.toTitleCase();\n translatedTitle = translatedTitle.italicize();\n\n primaryPart = primaryPart.appendData('[' + translatedTitle + ']', ' ', '', ''); \n }\n\n primaryPart = shared.fixClosure(primaryPart);\n \n return primaryPart;\n}\n\nfunction getFirstSupplemental(refData){\n let firstSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n firstSupplemental = firstSupplemental.upperFirstLetter();\n firstSupplemental = shared.fixClosure(firstSupplemental);\n\n return firstSupplemental;\n}\n\nfunction getContainerOne(refData){\n let container1 = ''; \n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //Secondary Contribs\n let secondaryContributor = shared.getSecondaryContributorString(refData.contributors);\n container1 = container1.appendData(secondaryContributor, ', ');\n\n //websiteTitle\n let websiteTitle = shared.getStringValue(refData.websiteTitle);\n container1 = container1.appendData(websiteTitle.replaceAll(\"’\", \"'\"), ', ');\n\n //publicationDate\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n container1 = container1.appendData(publicationDate, ', ');\n\n //Test 54\n //odd odd scenario...if we get to here, and they have only given us \n //a website title and publication date, swap their order\n let primaryInfo = getPrimaryInformation(refData);\n let firstSupplemental = getFirstSupplemental(refData);\n\n if (primaryInfo.length == 0 &&\n firstSupplemental.length == 0 &&\n websiteTitle.length > 0 &&\n publicationDate.length > 0) {\n \n container1 = publicationDate;\n container1 = container1.appendData(websiteTitle, ', ');\n }\n\n\n //url\n let url = shared.getStringValue(refData.url);\n\n if (url.length > 0) {\n url = shared.formatURL(url);\n container1 = container1.appendData(url, ', ');\n }\n\n container1 = container1.upperFirstLetter();\n container1 = shared.fixClosure(container1);\n\n return container1;\n}\n\nfunction getContainerTwo(refData){\n let container2 = '';\n\n return container2;\n}\n\nfunction getSecondSupplemental(refData){\n let secondSupplemental = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //retrievalDate\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n retrievalDate = shared.getFullDate(retrievalDate);\n secondSupplemental = secondSupplemental.appendData(retrievalDate, ', ', 'accessed', '');\n \n //format\n let format = shared.getStringValue(refData.format);\n secondSupplemental = secondSupplemental.appendData(format, ', ', '', 'download');\n\n secondSupplemental = secondSupplemental.upperFirstLetter();\n secondSupplemental = shared.fixClosure(secondSupplemental);\n \n return secondSupplemental;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n // let locationPart = getLocationPart(refData);\n let publicationPart = getPublicationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n // referenceValue = referenceValue.appendData(locationPart);\n referenceValue = referenceValue.appendData(publicationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n \n let type = shared.getStringValue(refData.type);\n \n let sponsor = shared.getStringValue(refData.sponsor);\n sponsor = sponsor.replaceAmpersand().toTitleCase(); \n titlePart = titlePart.appendData(sponsor);\n titlePart = titlePart.addClosure();\n\n let title = shared.getStringValue(refData.title);\n title = title.doubleQuote(); \n titlePart = titlePart.appendData(title);\n titlePart = titlePart.addClosure();\n\n let format = shared.getStringValue(refData.format);\n if(format.length > 0){\n format = format.upperFirstLetter();\n titlePart = titlePart.appendData(format, ' ', '', 'advertisement');\n } else {\n titlePart = titlePart.appendData('Advertisement');\n }\n titlePart = titlePart.addClosure();\n \n if(type === 'physical'){\n let location = shared.getStringValue(refData.location);\n titlePart = titlePart.appendData(location);\n titlePart = titlePart.addClosure();\n }\n\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n\n if(publicationDate !== 'n.d.'){\n publicationPart = publicationPart.appendData(publicationDate, ', ');\n publicationPart = publicationPart.addClosure();\n }\n \n publicationPart = publicationPart.addClosure();\n\n // url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n publicationPart = publicationPart.appendData(url);\n }\n\n return publicationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.sponsor);\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let type = shared.getStringValue(refData.type);\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let sponsor = shared.getStringValue(refData.sponsor);\n\n sponsor = sponsor.replaceAmpersand().toTitleCase(); \n firstInfo = firstInfo.appendData(sponsor, ', ');\n\n let title = shared.getStringValue(refData.title);\n title = title.doubleQuote(); \n firstInfo = firstInfo.appendData(title, ', ');\n\n let format = shared.getStringValue(refData.format);\n\n if(format.length > 0){\n format = shared.fixFormatStringForCitation(format);\n if(title.length !== 0 || sponsor.length !== 0){\n format = format.lowerFirstLetter();\n }\n firstInfo = firstInfo.appendData(format, ', ', '', 'advertisement', true);\n\n } else {\n firstInfo = firstInfo.appendData('advertisement', ', ', '', '', true);\n\n }\n \n\n let location = '';\n\n if(type === 'physical'){\n location = shared.getStringValue(refData.location);\n firstInfo = firstInfo.appendData(location, ', ');\n }\n \n let publicationDate = shared.getFullDate(refData.publicationDate);\n if(publicationDate !== 'n.d.'){\n firstInfo = firstInfo.appendData(publicationDate, ', ');\n }\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n citationLocation = shared.parseTimeStampString(citationLocation);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n\n firstInfo = firstInfo.upperFirstLetter();\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n // let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n // subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n let subsequentSponsor = shared.getStringValue(refData.sponsor);\n subsequentSponsor = subsequentSponsor.replaceAmpersand().toTitleCase();\n\n let subsequentTitle = shared.getStringValue(refData.title);\n // console.log('subsequentTitle.length');\n // console.log(subsequentTitle.length);\n // console.log('location.length');\n // console.log(location.length);\n\n if(subsequentTitle.length === 0 && location.length === 0){\n // console.log('missing title and location');\n if(subsequentSponsor.length === 0){\n // also missing sponsor\n subsequentInfo = subsequentInfo.appendData('Advertisement');\n\n } else {\n subsequentInfo = subsequentInfo.appendData(subsequentSponsor);\n\n }\n\n } else if(subsequentTitle.length === 0 && subsequentSponsor.length === 0){\n // console.log('missing title and sponsor');\n if(type === 'physical'){\n format = format.upperFirstLetter();\n subsequentInfo = subsequentInfo.appendData(format, ', ', '', 'advertisement');\n }\n } else if(subsequentTitle.length === 0 && publicationDate === 'n.d.'){\n // console.log('missing title and date')\n subsequentInfo = subsequentInfo.appendData(subsequentSponsor);\n } else if(subsequentTitle.length === 0 && format.length === 0){\n // console.log('missing title and format')\n subsequentInfo = subsequentInfo.appendData(subsequentSponsor);\n } else {\n // console.log('missing nothing');\n subsequentInfo = subsequentInfo.appendData(subsequentSponsor, ', ');\n\n subsequentTitle = subsequentTitle.shortenName().doubleQuote();\n subsequentInfo = subsequentInfo.appendData(subsequentTitle, ', ');\n\n }//e:if:missing.parts\n \n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n \n subsequentInfo = subsequentInfo.upperFirstLetter();\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n let workTitle = shared.getStringValue(refData.bookTitle);\n \n if(translatedTitle.length === 0){\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n } else {\n workTitle = workTitle.replaceAmpersand().italicize(); \n }\n \n titlePart = titlePart.appendData(workTitle);\n\n translatedTitle = translatedTitle.replaceAmpersand().bracket();\n titlePart = titlePart.appendData(translatedTitle);\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n let edition = shared.getStringValue(refData.edition);\n edition = shared.fixEditionString(edition);\n titlePart = titlePart.appendData(edition);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let publisherString = shared.getPublisherString(refData.publishers);\n publicationPart = publicationPart.appendData(publisherString);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n \n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.bookTitle).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n \n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n let workTitle = shared.getStringValue(refData.bookTitle);\n \n if(translatedTitle.length === 0){\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n } else {\n workTitle = workTitle.replaceAmpersand().italicize(); \n }\n\n firstInfo = firstInfo.appendData(workTitle, \", \");\n \n translatedTitle = translatedTitle.replaceAmpersand().bracket();\n firstInfo = firstInfo.appendData(translatedTitle);\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let edition = shared.getStringValue(refData.edition);\n edition = shared.fixEditionString(edition);\n firstInfo = firstInfo.appendData(edition, ', ');\n \n let publisherPart = '';\n\n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true);\n publisherPart = publisherPart.appendData(publisherLocationString);\n \n let publicationDate = shared.getFullDate(refData.publicationDate);\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n\n publisherPart = publisherPart.parenthesis();\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.bookTitle);\n\n let translatedTitleSubsequent = shared.getStringValue(refData.translatedTitle);\n \n if(translatedTitleSubsequent.length === 0){\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().italicize();\n } else {\n workTitle = workTitle.replaceAmpersand().shortenName().italicize();\n }\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n\n if(citationData.type === 'actSceneLine'){\n subsequentInfo = subsequentInfo.appendData(citationLocation);\n } else {\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n }\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let type = shared.getStringValue(refData.type);\n\t// let kind = shared.getStringValue(refData.kind);\n\n let workTitle;\n let translatedAnthologyTitle = shared.getStringValue(refData.translatedAnthologyTitle);;\n let translatedEntryTitle = shared.getStringValue(refData.translatedEntryTitle);\n\n\tif(type === 'anthology'){\n\t\tworkTitle = shared.getStringValue(refData.anthologyTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n }\n else{\n if(translatedAnthologyTitle.length > 0){\n workTitle = workTitle.replaceAmpersand().italicize();\n } else {\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n }\n }\n \n\t} else if(type === 'entry'){\n workTitle = shared.getStringValue(refData.entryTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n }\n else{\n if(translatedEntryTitle.length > 0){\n workTitle = workTitle.replaceAmpersand().doubleQuote();\n } else {\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote();\n }\n }\n\t}\n \n titlePart = titlePart.appendData(workTitle);\n \n\n if(type === 'anthology'){\n\t\t//translatedAnthologyTitle\n if(translatedAnthologyTitle.length > 0){\n titlePart = titlePart.appendData('[' + translatedAnthologyTitle.replaceAmpersand() + ']', ' ', '', ''); \n }\n\t\t\n\t} else if(type === 'entry'){\n\t\t//translatedEntryTitle\n if(translatedEntryTitle.length > 0){\n titlePart = titlePart.appendData('[' + translatedEntryTitle.replaceAmpersand() + ']', ' ', '', ''); \n }\n\n\t}\n titlePart = titlePart.addClosure();\n\n if(type === 'anthology'){\n\t\t//originalPublicationDate\n\t\t// let originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n\t\t// originalPublicationDate = shared.getFullDate(originalPublicationDate);\n\t\t// titlePart = titlePart.appendData(originalPublicationDate, ', ');\n\t} else if(type === 'entry'){\n\t\t//originalPublicationDate\n\t\tlet originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n\t\toriginalPublicationDate = shared.getFullDate(originalPublicationDate);\n if(originalPublicationDate !== 'n.d.'){\n\t\t titlePart = titlePart.appendData(originalPublicationDate);\n titlePart = titlePart.addClosure();\n }\n\n let anthologyTitle = shared.getStringValue(refData.anthologyTitle);\n if(translatedAnthologyTitle.length > 0){\n anthologyTitle = anthologyTitle.replaceAmpersand().italicize();\n } else {\n anthologyTitle = anthologyTitle.replaceAmpersand().toTitleCase().italicize();\n }\n\n titlePart = titlePart.appendData(anthologyTitle, ' ', 'In');\n \n if(translatedAnthologyTitle.length > 0){\n titlePart = titlePart.appendData('[' + translatedAnthologyTitle.replaceAmpersand() + ']', ' ', '', ''); \n }\n titlePart = titlePart.addClosure();\n\t}\n\n let secondaryContributors = shared.getSecondaryContributorString(refData);\n titlePart = titlePart.appendData(secondaryContributors);\n \n \n if(type === 'anthology'){\n titlePart = titlePart.addClosure();\n }\n\n let pageNumbers = shared.getStringValue(refData.pageNumbers);\n pageNumbers = shared.fixPageDash(pageNumbers);\n if(secondaryContributors.length > 0){\n titlePart = titlePart.appendData(pageNumbers, ', ');\n } else {\n titlePart = titlePart.appendData(pageNumbers);\n }\n \n titlePart = titlePart.addClosure();\n\n let edition = shared.getStringValue(refData.edition);\n\tedition = shared.fixEditionString(edition);\n titlePart = titlePart.appendData(edition);\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n if (shared.isSelfPublished(refData)) {\n publicationPart = publicationPart.appendData('Self-published');\n } else{\n let publisherString = shared.getPublisherString(refData.publishers);\n publicationPart = publicationPart.appendData(publisherString);\n }\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n \n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let type = shared.getStringValue(refData.type);\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n \n let translatedAnthologyTitle = shared.getStringValue(refData.translatedAnthologyTitle);\n let translatedEntryTitle = shared.getStringValue(refData.translatedEntryTitle);\n\n let workTitle;\n if(type === 'anthology'){\n\t\tworkTitle = shared.getStringValue(refData.anthologyTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n }\n else{\n if(translatedAnthologyTitle.length > 0){\n workTitle = workTitle.replaceAmpersand().italicize();\n } else {\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n }\n }\n\n\t} else if(type === 'entry'){\n workTitle = shared.getStringValue(refData.entryTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n }\n else{\n if(translatedEntryTitle.length > 0){\n workTitle = workTitle.replaceAmpersand().doubleQuote();\n } else {\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote();\n }\n }\n \n\t}\n \n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n if(type === 'anthology'){\n\t\t//translatedAnthologyTitle\n\t\t\n if(translatedAnthologyTitle.length > 0){\n firstInfo = firstInfo.appendData('[' + translatedAnthologyTitle.replaceAmpersand() + ']', ' ', '', ''); \n }\n\n\t} else if(type === 'entry'){\n\t\t//translatedEntryTitle\n\t\t\n if(translatedEntryTitle.length > 0){\n firstInfo = firstInfo.appendData('[' + translatedEntryTitle.replaceAmpersand() + ']', ' ', '', ''); \n }\n\n //originalPublicationDate\n let originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n originalPublicationDate = shared.getFullDate(originalPublicationDate);\n if(originalPublicationDate !== 'n.d.'){\n firstInfo = firstInfo.appendData(originalPublicationDate.parenthesis(), ', ');\n }\n\n let anthologyTitle = shared.getStringValue(refData.anthologyTitle);\n if(translatedAnthologyTitle.length > 0){\n anthologyTitle = anthologyTitle.replaceAmpersand().italicize();\n } else {\n anthologyTitle = anthologyTitle.replaceAmpersand().toTitleCase().italicize();\n }\n firstInfo = firstInfo.appendData(anthologyTitle, ', ', 'in');\n\n \n if(translatedAnthologyTitle.length > 0){\n firstInfo = firstInfo.appendData('[' + translatedAnthologyTitle.replaceAmpersand() + ']', ' ', '', ''); \n }\n\t}\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let edition = shared.getStringValue(refData.edition);\n\tedition = shared.fixEditionString(edition);\n firstInfo = firstInfo.appendData(edition, ', ');\n\n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true);\n let publicationDate = shared.getFullDate(refData.publicationDate);\n let publisherPart = '';\n\n if (shared.isSelfPublished(refData)) {\n publisherPart = publisherPart.appendData('self-pub.');\n } else {\n publisherPart = publisherPart.appendData(publisherLocationString);\n }\n \n publisherPart = publisherPart.appendData(publicationDate, ', ');\n\n publisherPart = publisherPart.parenthesis();\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n } else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n let workTitleSubsequent;\n if(type === 'anthology'){\n\t\tworkTitleSubsequent = shared.getStringValue(refData.anthologyTitle);\n if(translatedAnthologyTitle.length > 0){\n workTitleSubsequent = workTitleSubsequent.replaceAmpersand().shortenName().italicize();\n } else {\n workTitleSubsequent = workTitleSubsequent.replaceAmpersand().toTitleCase().shortenName().italicize();\n }\n\t} else if(type === 'entry'){\n workTitleSubsequent = shared.getStringValue(refData.entryTitle);\n if(translatedAnthologyTitle.length > 0){\n workTitleSubsequent = workTitleSubsequent.replaceAmpersand().shortenName().doubleQuote();\n } else {\n workTitleSubsequent = workTitleSubsequent.replaceAmpersand().toTitleCase().shortenName().doubleQuote();\n }\n \n\t}\n \n subsequentInfo = subsequentInfo.appendData(workTitleSubsequent, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(titlePart);\n // referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.title);\n \n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n }\n\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n \n let model = shared.getStringValue(refData.model);\n titlePart = titlePart.appendData(model);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let authorPartRepeat = shared.getAuthorPart(refData);\n\n if(authorPartRepeat.length > 0 && authorPartRepeat.endsWith('.')){\n authorPartRepeat = authorPartRepeat.substring(0, authorPartRepeat.length - 1);\n \n }\n publicationPart = publicationPart.appendData(authorPartRepeat);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n\n if(publicationDate === 'n.d.' && publicationPart.length == 0){\n publicationDate = publicationDate.upperFirstLetter();\n }\n publicationPart = publicationPart.appendData(publicationDate, ', ');\n \n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n let type = shared.getStringValue(refData.type);\n\n if(type === 'apparatus'){\n locationPart = locationPart.appendData('Apparatus.');\n\n } else if(type === 'combo') {\n locationPart = locationPart.appendData('Apparatus and software.');\n \n }\n\n // url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n \n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let workTitle = shared.getStringValue(refData.title);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n }\n else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n }\n \n firstInfo = firstInfo.appendData(workTitle, ', ');\n\n let model = shared.getStringValue(refData.model);\n firstInfo = firstInfo.appendData(model, ', ');\n \n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart, ', ');\n\n let publicationDate = shared.getFullDate(refData.publicationDate);\n firstInfo = firstInfo.appendData(publicationDate, ', ');\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let type = shared.getStringValue(refData.type);\n\n if(type === 'apparatus'){\n firstInfo = firstInfo.appendData('apparatus', ', ');\n\n } else if(type === 'combo') {\n firstInfo = firstInfo.appendData('apparatus and software', ', ');\n \n }\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n \n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n // let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n // subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.title);\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().italicize();\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let datePart = getDatePart(refData);\n let sourcePart = getSourcePart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(datePart);\n referenceValue = referenceValue.appendData(sourcePart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.title);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\n\nfunction getDatePart(refData){\n let datePart = '';\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getYear(publicationDate);\n\n if (publicationDate == 'n.d.') {\n publicationDate = publicationDate.upperFirstLetter();\n }\n\n datePart = datePart.appendData(publicationDate).addClosure();\n\n //format (ex: oil painting)\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format).upperFirstLetter();\n datePart = datePart.appendData(format).addClosure();\n\n return datePart;\n}\n\nfunction getSourcePart(refData){\n // Museum Name, Washington, D.C.\n // ('United States' not to be included)\n let sourcePart = '';\n\n let publisherString = shared.getPublisherStringInverted(refData.publishers);\n\n if(publisherString !== 'N.p.'){\n sourcePart = sourcePart.appendData(publisherString);\n }\n\n let city = shared.getStringValue(refData.city);\n if (city.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', '\n }\n\n sourcePart = sourcePart + city;\n }\n\n let state = shared.getStringValue(refData.state);\n if (state.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', '\n }\n\n sourcePart = sourcePart + state;\n }\n\n let country = shared.getStringValue(refData.country);\n if (country.length > 0 && country !== 'United States') {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', '\n }\n\n sourcePart = sourcePart + country;\n }\n\n sourcePart = sourcePart.addClosure();\n\n if (refData.type != 'museum') {\n // url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n sourcePart = sourcePart.appendData(url);\n }\n }\n return sourcePart;\n}\n\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let workTitle = shared.getStringValue(refData.title);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle)//;.toLowerCase();\n if(authorPart !== ''){\n workTitle = workTitle.toLowerCase();\n }\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n // let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n // firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n // publicationDate = shared.getFullDate(publicationDate);\n publicationDate = shared.getYear(publicationDate);\n firstInfo = firstInfo.appendData(publicationDate, ', ');\n\n //format (ex: oil painting)\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format).toLowerCase();\n firstInfo = firstInfo.appendData(format, \", \");\n\n // source part (all the publishers/city/state/etc) - add it after the string is completed\n let sourcePart = '';\n\n let publisherString = shared.getPublisherStringInverted(refData.publishers);\n\n if(publisherString !== 'N.p.'){\n sourcePart = sourcePart.appendData(publisherString);\n }\n\n let city = shared.getStringValue(refData.city);\n if (city.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', '\n }\n\n sourcePart = sourcePart + city;\n }\n\n let state = shared.getStringValue(refData.state);\n if (state.length > 0) {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', '\n }\n\n sourcePart = sourcePart + state;\n }\n\n let country = shared.getStringValue(refData.country);\n if (country.length > 0 && country !== 'United States') {\n if (sourcePart.length > 0) {\n sourcePart = sourcePart + ', '\n }\n\n sourcePart = sourcePart + country;\n }\n\n firstInfo = firstInfo.appendData(sourcePart, \", \");\n\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n // url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n \n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.title);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle).shortenName();\n \n if(authorPart !== ''){\n workTitle = workTitle.toLowerCase();\n }\n\n workTitle = workTitle.addClosure();\n } else{\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().italicize();\n }\n \n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getAuthorPart(refData){\n let authorPart = '';\n\n switch (refData.kind) {\n case 'senate':\n case 'senateJoint':\n authorPart = 'US Congress, Senate.';\n break;\n case 'house':\n case 'houseJoint':\n authorPart = 'US Congress, House.';\n break;\n }\n\n return authorPart;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n let shortTitle = shared.getStringValue(refData.shortTitle);\n\n if (shortTitle.length > 0) {\n title = shortTitle;\n }\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n title = title.replaceAmpersand().toTitleCase(); \n }\n\n titlePart = titlePart.appendData(title);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n //H. Res. [billNumber]. [session] Cong. [sessionPart] sess.\n switch (refData.kind) {\n case 'senate':\n publicationPart = publicationPart.appendData('S. Res.');\n break;\n case 'senateJoint':\n publicationPart = publicationPart.appendData('S. Joint Res.');\n break;\n case 'house':\n publicationPart = publicationPart.appendData('H. Res.');\n break;\n case 'houseJoint':\n publicationPart = publicationPart.appendData('H. Joint Res.');\n break;\n }\n\n let billNumber = shared.getStringValue(refData.billNumber);\n publicationPart = publicationPart.appendData(billNumber);\n publicationPart = publicationPart.addClosure();\n\n let session = shared.getStringValue(refData.session);\n\n if (session.length > 0) {\n session = shared.getOrdinalValue(session);\n publicationPart = publicationPart.appendData(session);\n publicationPart = publicationPart.appendData('Cong.');\n }\n\n let sessionPart = shared.getStringValue(refData.sessionPart);\n\n if (sessionPart.length > 0) {\n publicationPart = publicationPart.appendData(sessionPart);\n publicationPart = publicationPart.appendData('sess.'); \n }\n\n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //some of this is technically publication, but it keeps the logic simpler\n //Congressional Record [volume] ([publicationDate]): [pageNumber], [url].\n\n locationPart = locationPart.appendData('Congressional Record');\n\n let volume = shared.getStringValue(refData.volume);\n locationPart = locationPart.appendData(volume);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n \n if (publicationDate.length > 0) {\n publicationDate = shared.getYear(publicationDate);\n }\n else{\n publicationDate = 'n.d.';\n }\n\n publicationDate = publicationDate.parenthesis(); \n locationPart = locationPart.appendData(publicationDate);\n\n let pageNumber = shared.getStringValue(refData.pageNumber);\n\n if (pageNumber.length > 0) {\n locationPart = locationPart + ':'\n locationPart = locationPart.appendData( pageNumber);\n }\n\n let url = shared.getStringValue(refData.url);\n\n if (url.length > 0) {\n url = shared.formatURL(url)\n locationPart = locationPart.appendData(url, ', ');\n }\n\n locationPart = locationPart.addClosure();\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n let shortTitle = shared.getStringValue(refData.shortTitle).replaceAmpersand();\n\n if (shortTitle.length > 0) {\n citationTitle = shortTitle;\n }\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n // [title], S. Res. [billNumber], [session] Cong., [sessionPart] sess., Congressional Record [volume], p. [pageNumber] ([publicationDate]), [location], [url].\n // [title], H. Res. [billNumber], [session] Cong., [sessionPart] sess., Congressional Record [volume], p. [pageNumber] ([publicationDate]), [location], [url].\n // [title], S. Joint Res. [billNumber], [session] Cong. [sessionPart] sess.,, Congressional Record [volume], p. [pageNumber] ([publicationDate]), [location], [url].\n // [title], H. Joint Res. [billNumber], [session] Cong., [sessionPart] sess., Congressional Record [volume], p. [pageNumber] ([publicationDate]), [location], [url].\n // [title], S. Res. [billNumber], [session] Cong., [sessionPart] sess., Congressional Record [volume], p. [pageNumber] ([publicationDate]), [location], [url].\n // [title], H. Res. [billNumber], [session] Cong., [sessionPart] sess., Congressional Record [volume], p. [pageNumber] ([publicationDate]), [location], [url].\n // [title], S. Joint Res. [billNumber], [session] Cong., [sessionPart] sess., Congressional Record [volume], p. [pageNumber] ([publicationDate]), [location], [url].\n // [title], H. Joint Res. [billNumber], [session] Cong., [sessionPart] sess., Congressional Record [volume], p. [pageNumber] ([publicationDate]), [location], [url].\n\n let title = shared.getStringValue(refData.title);\n let shortTitle = shared.getStringValue(refData.shortTitle);\n\n if (shortTitle.length > 0) {\n title = shortTitle;\n }\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n title = title.replaceAmpersand().toTitleCase(); \n }\n\n firstInfo = firstInfo.appendData(title);\n\n switch (refData.kind) {\n case 'senate':\n firstInfo = firstInfo.appendData('S. Res.', \", \");\n break;\n case 'senateJoint':\n firstInfo = firstInfo.appendData('S. Joint Res.', \", \");\n break;\n case 'house':\n firstInfo = firstInfo.appendData('H. Res.', \", \");\n break;\n case 'houseJoint':\n firstInfo = firstInfo.appendData('H. Joint Res.', \", \");\n break;\n }\n\n let billNumber = shared.getStringValue(refData.billNumber);\n firstInfo = firstInfo.appendData(billNumber);\n\n let session = shared.getStringValue(refData.session);\n\n if (session.length > 0) {\n session = shared.getOrdinalValue(session);\n firstInfo = firstInfo.appendData(session, ', ');\n firstInfo = firstInfo.appendData('Cong.');\n }\n\n let sessionPart = shared.getStringValue(refData.sessionPart);\n\n if (sessionPart.length > 0) {\n firstInfo = firstInfo.appendData(sessionPart, ', ');\n firstInfo = firstInfo.appendData('sess.'); \n }\n\n firstInfo = firstInfo.appendData('Congressional Record', ', ');\n\n let volume = shared.getStringValue(refData.volume);\n firstInfo = firstInfo.appendData(volume);\n\n let pageNumber = shared.getStringValue(refData.pageNumber);\n\n if (pageNumber.length > 0) {\n firstInfo = firstInfo.appendData('p. ' + pageNumber, ', ');\n }\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n \n if (publicationDate.length > 0) {\n publicationDate = shared.getYear(publicationDate);\n }\n else{\n publicationDate = 'n.d.';\n }\n\n publicationDate = publicationDate.parenthesis(); \n firstInfo = firstInfo.appendData(publicationDate);\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let url = shared.getStringValue(refData.url);\n\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n\n //[shortenedTitle], [location].\n shortTitle = shared.getStringValue(refData.shortTitle);\n\n if (shortTitle.length > 0) {\n subsequentInfo = subsequentInfo.appendData(shortTitle.replaceAmpersand().toTitleCase(), ', ');\n }\n else{\n title = shared.getStringValue(refData.title);\n title = title.replaceAmpersand().toTitleCase();\n\n subsequentInfo = subsequentInfo.appendData(title, ', ');\n }\n\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n if (subsequentInfo.length == 0) {\n let billNumber = shared.getStringValue(refData.billNumber);\n\n if (billNumber.length > 0) {\n switch (refData.kind) {\n case 'senate':\n subsequentInfo = 'S. Res. ' + billNumber;\n break;\n case 'senateJoint':\n subsequentInfo = 'S. Joint Res. ' + billNumber;\n break;\n case 'house':\n subsequentInfo = 'H. Res. ' + billNumber;\n break;\n case 'houseJoint':\n subsequentInfo = 'H. Joint Res. ' + billNumber;\n break;\n }\n } \n }\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\nlet isAuthorAndBlogTitleEqual = false;\n\nfunction getReference(refData) {\n isAuthorAndBlogTitleEqual = false;\n\n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n\n // If the authors and the blog name are the exact same, then omit the Group Author\n if(authorPart.endsWith('.')){\n let checkAuthorPart = authorPart.slice(0, -1);\n let blogTitle = shared.getStringValue(refData.blogTitle);\n if(checkAuthorPart === blogTitle){\n isAuthorAndBlogTitleEqual = true;\n authorPart = '';\n }\n }\n\n\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n\n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let type = shared.getStringValue(refData.type);\n if(!type){\n type = 'entry'; // sets the default to entry if there isn't one\n }\n\n if(type === 'entry'){\n let entryTitle = shared.getStringValue(refData.entryTitle);\n\n // if this is a description, remove the brackets\n if (entryTitle.startsWith('[')) {\n entryTitle = shared.removeDescriptionFromTitle(entryTitle);\n } else{\n entryTitle = entryTitle.replaceAmpersand().toTitleCase().doubleQuote();\n }\n\n titlePart = titlePart.appendData(entryTitle);\n titlePart = titlePart.addClosure();\n }\n\n let blogTitle = shared.getStringValue(refData.blogTitle);\n blogTitle = blogTitle.replaceAmpersand().toTitleCase().italicize();\n \n titlePart = titlePart.appendData(blogTitle, ' ', '', '(blog)');\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n titlePart = titlePart.appendData(description);\n titlePart = titlePart.addClosure();\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n seriesTitle = seriesTitle.replaceAmpersand().toTitleCase();\n titlePart = titlePart.appendData(seriesTitle);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let publisherString = shared.getPublisherString(refData.publishers, 'reference', false, false);\n \n if (publisherString !== 'N.p.') {\n publisherString = publisherString.italicize();\n publicationPart = publicationPart.appendData(publisherString);\n }\n \n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n\n if(refData.type == 'entry'){\n publicationPart = publicationPart.appendData(publicationDate, ', ');\n publicationPart = publicationPart.upperFirstLetter();\n }\n publicationPart = publicationPart.addClosure(); \n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.entryTitle).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n isAuthorAndBlogTitleEqual = false;\n\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let entryTitle = '';\n\n let type = shared.getStringValue(refData.type);\n if(!type){\n type = 'entry'; // sets the default to entry if there isn't one\n }\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n \n \n let checkBlogTitle = shared.getStringValue(refData.blogTitle);\n \n // If the authors and the blog name are the exact same, then omit the Group Author\n if(authorPart === checkBlogTitle){\n isAuthorAndBlogTitleEqual = true;\n authorPart = '';\n }\n firstInfo = firstInfo.appendData(authorPart);\n\n if(type === 'entry'){\n entryTitle = shared.getStringValue(refData.entryTitle);\n\n if (entryTitle.startsWith('[')) {\n entryTitle = shared.removeDescriptionFromTitle(entryTitle);\n } else{\n entryTitle = entryTitle.replaceAmpersand().toTitleCase();\n entryTitle = entryTitle.doubleQuote(); \n }\n \n firstInfo = firstInfo.appendData(String(entryTitle), ', ', '', '');\n }\n\n let blogTitle = shared.getStringValue(refData.blogTitle);\n\n blogTitle = blogTitle.replaceAmpersand().toTitleCase().italicize();\n \n // blogTitle = blogTitle.toTitleCase();\n // if(!isAuthorAndBlogTitleEqual){\n // blogTitle = blogTitle.italicize();\n // }\n \n // Test: 10 - APA 10.17 Example & Missing Publisher\n // Test Type: Turabian 9 First Citation\n // i need EXP to read [***Will?,\"***] but instead it reads [***Will?\"***]\n firstInfo = firstInfo.appendData(blogTitle, ', ', '', '(blog)', true);\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n description = description.toLowerCase();\n firstInfo = firstInfo.appendData(description, ', ');\n\n let publisherPart = '';\n \n let publisher = shared.getPublisherString(refData.publishers, 'reference', true, false);\n\n if (publisher !== 'N.p.') {\n publisher = publisher.italicize();\n publisherPart = publisherPart.appendData(publisher);\n }\n\n\n let publicationDate = shared.getFullDate(refData.publicationDate);\n if(type === 'entry'){\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n }\n\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n if(isAuthorAndBlogTitleEqual){\n subsequentAuthorPart = '';\n }\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n if(type === 'entry'){\n entryTitle = shared.getStringValue(refData.entryTitle);\n\n // if this is a description, remove the brackets\n if (entryTitle.startsWith('[')) {\n entryTitle = shared.removeDescriptionFromTitle(entryTitle).shortenName();\n entryTitle = entryTitle.addClosure();\n } else{\n entryTitle = entryTitle.replaceAmpersand().shortenName().toTitleCase().doubleQuote();\n \n }\n } else if(type === 'blog'){\n entryTitle = blogTitle;\n \n }\n\n subsequentInfo = subsequentInfo.appendData(entryTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n if (refData.type == 'bookChapter') {\n citationTitle = shared.getStringValue(refData.chapterTitle).replaceAmpersand();\n }\n else{\n citationTitle = shared.getStringValue(refData.bookTitle).replaceAmpersand(); \n }\n\n if ((refData.type == 'book' && refData.kind == 'multivolume') || refData.type == 'series' && refData.kind == 'series') {\n citationTitle = shared.getStringValue(refData.seriesTitle).replaceAmpersand();\n }\n\n if (refData.type == 'series' && refData.kind == 'volume') {\n citationTitle = shared.getStringValue(refData.volumeTitle).replaceAmpersand();\n }\n\n if (citationTitle.startsWith('[')) {\n citationTitle = citationTitle.removeBrackets();\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n // Book: Whole\n //First Middle Last Suffix, Title of the Book, con. First Middle Last Suffix, Edition (City, ST: Publisher, 2020), Format, pp., https://doi.org/10.12345/.\n //define our citation logic for this type here\n let titleProperty = 'pageTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n let isTrans = isTranslated(refData);\n \n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let bookTitle = shared.getStringValue(refData.bookTitle);\n let chapterTitle = shared.getStringValue(refData.chapterTitle);\n let volumeTitle = shared.getStringValue(refData.volumeTitle);\n\n if (refData.type == 'bookChapter') {\n\n if (isGenericChapterTitle(chapterTitle)) {\n chapterTitle = chapterTitle.toLowerCase();\n }\n else{\n\n if (chapterTitle.startsWith('[')) {\n chapterTitle = shared.removeDescriptionFromTitle(chapterTitle);\n } else{\n if (!isTrans) {\n chapterTitle = chapterTitle.replaceAmpersand().toTitleCase(); \n }\n \n chapterTitle = chapterTitle.doubleQuote(); \n }\n }\n\n let translatedChapterTitle = shared.getStringValue(refData.translatedChapterTitle);\n\n if (translatedChapterTitle.length > 0) {\n\n translatedChapterTitle = translatedChapterTitle.replaceAmpersand();\n\n if (chapterTitle.length > 0) {\n translatedChapterTitle = translatedChapterTitle.bracket();\n }\n else{\n translatedChapterTitle = translatedChapterTitle.toTitleCase();\n }\n\n // translatedChapterTitle = translatedChapterTitle.toTitleCase().bracket();\n chapterTitle = chapterTitle.appendData(translatedChapterTitle);\n }\n \n if (refData.kind == 'multivolume') {\n if (volumeTitle.length > 0) {\n volumeTitle = volumeTitle.replaceAmpersand();\n volumeTitle = volumeTitle.toTitleCase().italicize();\n chapterTitle = chapterTitle.appendData(volumeTitle, ' in ');\n }\n }\n }\n\n if (bookTitle.startsWith('[')) {\n bookTitle = bookTitle.removeBrackets();\n }\n else{\n // if (refData.kind == 'translated') {\n bookTitle = bookTitle.replaceAmpersand();\n\n if ((isTrans && refData.type == 'bookChapter') || refData.kind == 'translated') {\n bookTitle = bookTitle.italicize();\n }\n else{\n bookTitle = bookTitle.toTitleCase().italicize();\n }\n }\n //translatedTitle\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (bookTitle.length == 0) {\n translatedTitle = translatedTitle.replaceAmpersand();\n translatedTitle = translatedTitle.toTitleCase();\n }\n else{\n translatedTitle = translatedTitle.bracket();\n }\n\n if (chapterTitle.length > 0) {\n\n firstInfo = firstInfo.appendData(chapterTitle, \", \");\n\n let translatorString = '';\n translatorString = shared.getChapterTranslatorString(refData.contributors);\n\n if (translatorString.length > 0) {\n let primaryType = shared.getPrimaryContributorType(refData);\n\n if (primaryType != 'chapterTranslator') {\n translatorString = translatorString.replace('Translated by', 'trans.');\n firstInfo = firstInfo.appendData(translatorString, ', '); \n } \n }\n \n if (isGenericChapterTitle(chapterTitle)) {\n firstInfo = firstInfo.appendData(\"to\", \" \");\n }\n else{\n if (refData.kind != 'multivolume') {\n firstInfo = firstInfo.appendData(\"in\", \", \", '', '', true);\n }\n }\n\n firstInfo = firstInfo.appendData(bookTitle.appendData(translatedTitle));\n }\n else{\n firstInfo = firstInfo.appendData(bookTitle.appendData(translatedTitle), \", \");\n }\n \n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n\n if (refData.type == 'series' && refData.kind == 'volume') {\n volumeTitle = shared.getStringValue(refData.volumeTitle);\n\n if (volumeTitle.length > 0) {\n volumeTitle = volumeTitle.replaceAmpersand();\n volumeTitle = volumeTitle.toTitleCase().italicize(); \n firstInfo = firstInfo.appendData(volumeTitle, \", \");\n }\n\n let volumeEditors = getEditorTypeString(refData.contributors, 'volume', true);\n\n if (volumeEditors.length > 0) {\n firstInfo = firstInfo.appendData(volumeEditors, \", \");\n }\n\n if (seriesTitle.length > 0) {\n\n seriesTitle = seriesTitle.replaceAmpersand();\n seriesTitle = seriesTitle.toTitleCase();\n\n let seriesEditors = getEditorTypeString(refData.contributors, 'series');\n\n if (seriesEditors.length == 0) {\n let volume = shared.getStringValue(refData.volume);\n\n seriesTitle = seriesTitle.appendData(volume);\n }\n\n firstInfo = firstInfo.appendData(seriesTitle, \", \");\n }\n\n }\n\n if ((refData.type == 'book' && refData.kind == 'multivolume') || refData.type == 'series' && refData.kind == 'series') {\n seriesTitle = seriesTitle.replaceAmpersand();\n seriesTitle = seriesTitle.toTitleCase().italicize();\n \n volumeTitle = shared.getStringValue(refData.volumeTitle);\n volumeTitle = volumeTitle.replaceAmpersand();\n volumeTitle = volumeTitle.toTitleCase().italicize();\n\n if (seriesTitle.length > 0) {\n firstInfo = firstInfo.appendData(seriesTitle, \", \");\n\n let volume = shared.getStringValue(refData.volume);\n\n if (volumeTitle.length > 0 && volume.length > 0) {\n volume = 'vol. ' + volume;\n firstInfo = firstInfo.appendData(volume, ', ');\n }\n }\n else{\n firstInfo = firstInfo.appendData(volumeTitle, \", \");\n }\n\n if (seriesTitle.length > 0 && volumeTitle.length > 0) { \n firstInfo = firstInfo.appendData(volumeTitle, ', ');\n }\n }\n\n let volume = shared.getStringValue(refData.volume);\n\n if (refData.type == 'series' && refData.kind == 'volume') {\n let seriesEditors = getEditorTypeString(refData.contributors, 'series', true);\n firstInfo = firstInfo.appendData(seriesEditors, \", \");\n\n if (seriesEditors.length > 0 && volume.length > 0) {\n firstInfo = firstInfo.appendData('vol. ' + volume, ', ');\n }\n }\n else{\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n }\n\n let referencePages = shared.getStringValue(refData.referencePages);\n\n if (refData.kind == 'multivolume' || refData.type == 'series') {\n seriesTitle = shared.getStringValue(refData.seriesTitle);\n \n if (seriesTitle.length == 0) {\n if (volume.length > 0) {\n volume = 'vol. ' + volume;\n firstInfo = firstInfo.appendData(volume, ', ');\n }\n }\n else{\n if (refData.type == 'bookChapter') {\n\n if (referencePages.length > 0) {\n referencePages = shared.formatPageNumbers(referencePages, false);\n firstInfo = firstInfo.appendData(referencePages, ', ');\n }\n\n if (volume.length > 0) {\n volume = 'vol. ' + volume;\n firstInfo = firstInfo.appendData(volume, ', ');\n }\n\n if (seriesTitle.length > 0) {\n seriesTitle = seriesTitle.replaceAmpersand();\n seriesTitle = seriesTitle.toTitleCase().italicize();\n\n if (volume.length > 0) {\n firstInfo = firstInfo.appendData(seriesTitle, ' of ');\n }\n else{\n firstInfo = firstInfo.appendData(seriesTitle, ', ');\n }\n }\n }\n }\n }\n // else{\n // if (refData.type == 'bookChapter') {\n\n // if (referencePages.length > 0) {\n // referencePages = shared.formatPageNumbers(referencePages, false);\n // firstInfo = firstInfo.appendData(referencePages, ', ');\n // }\n // }\n // }\n\n let edition = shared.getStringValue(refData.edition);\n edition = shared.fixEditionString(edition).toLowerCase().addClosure();\n firstInfo = firstInfo.appendData(edition, \", \");\n\n let citationVolume = shared.getCitationVolume(citationData);\n if (refData.type == 'series' && citationVolume.length > 0 && volume.length > 0) {\n citationVolume = 'vol. ' + citationVolume;\n firstInfo = firstInfo.appendData(citationVolume, ', ');\n }\n\n let citationValue = shared.getStringValue(citationData.value);\n //if this is a series, with a volume in the citation, but not the ref, and they don't have a page number\n //put the citation volume where volume should go\n if (refData.type == 'series' && citationVolume.length > 0 && volume.length == 0 && citationValue.length == 0) {\n citationVolume = 'vol. ' + citationVolume;\n firstInfo = firstInfo.appendData(citationVolume, ', ');\n }\n\n let originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n let originalPublicationDateYear = originalPublicationDate.getYear(originalPublicationDate);\n\n let publicationPart = '';\n let publisherString = '';\n\n if (shared.isSelfPublished(refData)) {\n\n // if (originalPublicationDateYear.length > 0 && refData.kind != 'translated') {\n if (originalPublicationDateYear.length > 0 && !isTrans) {\n publisherString = originalPublicationDateYear + '; repr., ';\n }\n\n //if we have a location, we need to add that in\n let publishers = [];\n let publisher = new Object();\n\n publisher.city = refData.publishers[0].city;\n publisher.state = refData.publishers[0].state;\n publisher.type = refData.publishers[0].type;\n publisher.name = '';\n\n publishers.push(publisher);\n\n let publisherLocationString = shared.getPublisherString(publishers, 'reference', true);\n\n if (publisherLocationString != 'n.p.') {\n publisherString = publisherString + publisherLocationString + ': self-pub.';\n }\n else{\n publisherString = publisherString + 'self-pub.';\n }\n }\n else{\n publisherString = shared.getPublisherString(refData.publishers, 'reference', true);\n\n if (originalPublicationDateYear.length > 0 && !isTrans) {\n publisherString = originalPublicationDateYear + '; repr., ' + publisherString;\n }\n }\n\n if (firstInfo.length == 0 && publisherString.startsWith('n.p.')) {\n publisherString = publisherString.upperFirstLetter();\n }\n\n publicationPart = publicationPart.appendData(publisherString, \", \");\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n \n if (publicationDate.length > 0) {\n publicationDate = shared.getYear(publicationDate); \n \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n }\n else{\n if (originalPublicationDateYear.length > 0) {\n publicationPart = publicationPart.appendData(originalPublicationDateYear, ', ');\n }\n else{\n publicationPart = publicationPart.appendData('n.d.', ', ');\n }\n }\n\n if (firstInfo.endsWith('.')) {\n firstInfo = firstInfo.appendData(publicationPart.parenthesis());\n }\n else{\n firstInfo = firstInfo.appendData(publicationPart.parenthesis(), ', '); \n }\n\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n bookTitle = shared.getStringValue(refData.bookTitle);\n chapterTitle = shared.getStringValue(refData.chapterTitle);\n\n if (refData.type == 'bookChapter') {\n\n if (isGenericChapterTitle(chapterTitle)) {\n chapterTitle = chapterTitle.toLowerCase();\n chapterTitle = chapterTitle.appendData(\"to\");\n\n bookTitle = bookTitle.replaceAmpersand();\n bookTitle = bookTitle.shortenName(isTrans).toTitleCase().italicize();\n\n chapterTitle = chapterTitle.appendData(bookTitle);\n }\n else{\n\n if (chapterTitle.startsWith('[')) {\n chapterTitle = shared.removeDescriptionFromTitle(chapterTitle);\n } else{\n chapterTitle = chapterTitle.shortenName(isTrans);\n\n if (!isTrans) {\n chapterTitle = chapterTitle.replaceAmpersand();\n chapterTitle = chapterTitle.toTitleCase(); \n }\n\n chapterTitle = chapterTitle.doubleQuote(); \n }\n }\n\n subsequentInfo = subsequentInfo.appendData(chapterTitle, \", \");\n }\n else{\n bookTitle = bookTitle.replaceAmpersand();\n\n if (bookTitle.startsWith('[')) {\n bookTitle = bookTitle.removeBrackets().shortenName(isTrans);\n }\n else{\n if (refData.kind == 'translated') {\n bookTitle = bookTitle.shortenName(isTrans).italicize();\n }\n else{\n bookTitle = bookTitle.shortenName(isTrans).toTitleCase().italicize();\n }\n }\n \n if (bookTitle.length > 0) {\n subsequentInfo = subsequentInfo.appendData(bookTitle, \", \");\n }\n else{\n //see if we have a translated title\n translatedTitle = shared.getStringValue(refData.translatedTitle);\n \n if (translatedTitle.length > 0) {\n translatedTitle = translatedTitle.shortenName().bracket();\n subsequentInfo = subsequentInfo.appendData(translatedTitle, \", \");\n }\n }\n }\n \n if ((refData.type == 'book' && refData.kind == 'multivolume') || refData.type == 'series' && refData.kind == 'series') {\n seriesTitle = shared.getStringValue(refData.seriesTitle);\n seriesTitle = seriesTitle.replaceAmpersand();\n seriesTitle = seriesTitle.shortenName(isTrans).toTitleCase().italicize();\n\n if (seriesTitle.length > 0) {\n subsequentInfo = subsequentInfo.appendData(seriesTitle, \", \"); \n }\n else{\n volumeTitle = shared.getStringValue(refData.volumeTitle);\n\n if (volumeTitle.length > 0) {\n volumeTitle = volumeTitle.replaceAmpersand();\n volumeTitle = volumeTitle.shortenName(isTrans).toTitleCase().italicize();\n subsequentInfo = subsequentInfo.appendData(volumeTitle, \", \"); \n }\n }\n }\n\n if (refData.type == 'series' && refData.kind == 'volume') {\n volumeTitle = shared.getStringValue(refData.volumeTitle);\n\n if (volumeTitle.length > 0) {\n volumeTitle = volumeTitle.shortenName(isTrans).toTitleCase().italicize();\n subsequentInfo = subsequentInfo.appendData(volumeTitle, \", \");\n }\n }\n\n //weird, location is not at the end of the string\n let citation = shared.getCitations(citationData, firstInfo, subsequentInfo, refData);\n\n if (citation.first.endsWith('.')) {\n citation.first = citation.first.slice(0, -1);\n }\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n\n citation.first = citation.first.appendData(format, ', ');\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n citation.first = citation.first.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n citation.first = citation.first.appendData(url, ', ');\n }\n }\n\n if (!citation.first.endsWith('.')) {\n citation.first = citation.first + '.';\n }\n\n return citation;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n let isTrans = isTranslated(refData);\n\n //Title of the Book: Subtitle of the Book. [edition]. Edited by First Middle Last Suffix. Translated by First Middle Last Suffix. Illustrated by First Middle Last Suffix. Narrated by First Middle Last Suffix.\n\n let bookTitle = shared.getStringValue(refData.bookTitle);\n let chapterTitle = shared.getStringValue(refData.chapterTitle);\n let volumeTitle = shared.getStringValue(refData.volumeTitle);\n\n if (refData.type == 'bookChapter') {\n\n if (chapterTitle.startsWith('[')) {\n chapterTitle = shared.removeDescriptionFromTitle(chapterTitle);\n } else{\n\n chapterTitle = chapterTitle.replaceAmpersand();\n\n if (!isTrans) {\n chapterTitle = chapterTitle.toTitleCase();\n }\n \n if (!isGenericChapterTitle(chapterTitle)) {\n chapterTitle = chapterTitle.doubleQuote();\n } \n }\n\n let translatedChapterTitle = shared.getStringValue(refData.translatedChapterTitle);\n\n if (translatedChapterTitle.length > 0) {\n \n translatedChapterTitle = translatedChapterTitle.replaceAmpersand();\n\n if (chapterTitle.length > 0) {\n translatedChapterTitle = translatedChapterTitle.bracket();\n }\n else{\n translatedChapterTitle = translatedChapterTitle.toTitleCase();\n }\n\n chapterTitle = chapterTitle.appendData(translatedChapterTitle);\n }\n }\n\n if (bookTitle.startsWith('[')) {\n bookTitle = bookTitle.removeBrackets();\n }\n else{\n\n bookTitle = bookTitle.replaceAmpersand();\n if ((isTrans && refData.type == 'bookChapter') || refData.kind == 'translated') {\n bookTitle = bookTitle.italicize();\n }\n else{\n bookTitle = bookTitle.toTitleCase().italicize();\n }\n }\n\n if (chapterTitle.length > 0) {\n\n if (isGenericChapterTitle(chapterTitle)) {\n titlePart = titlePart.appendData(chapterTitle);\n titlePart = titlePart.appendData(bookTitle, ' to ');\n }\n else{\n titlePart = titlePart.appendData(chapterTitle.addClosure());\n\n let translatorString = '';\n translatorString = shared.getChapterTranslatorString(refData.contributors);\n\n if (translatorString.length > 0) {\n\n let primaryType = shared.getPrimaryContributorType(refData);\n\n if (primaryType != 'chapterTranslator') {\n titlePart = titlePart.appendData(translatorString);\n titlePart = titlePart.addClosure();\n } \n }\n\n if (refData.type == 'bookChapter' && refData.kind == 'multivolume') {\n if (volumeTitle.length > 0) {\n volumeTitle = volumeTitle.replaceAmpersand();\n volumeTitle = volumeTitle.toTitleCase().italicize();\n titlePart = titlePart.appendData(volumeTitle, ' In ');\n }\n }\n\n titlePart = titlePart.appendData(bookTitle, ' In ');\n }\n }\n else{\n titlePart = titlePart.appendData(bookTitle);\n }\n\n //translatedTitle\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (translatedTitle.length > 0) {\n translatedTitle = translatedTitle.replaceAmpersand();\n // let isTranslated = isTranslated(refData);\n if (bookTitle.length == 0) {\n translatedTitle = translatedTitle.toTitleCase();\n }\n else{\n translatedTitle = translatedTitle.bracket();\n }\n \n titlePart = titlePart.appendData(translatedTitle);\n }\n\n titlePart = titlePart.addClosure();\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n \n if ((refData.kind == 'multivolume' && refData.type == 'book') || (refData.type == 'series' && refData.kind == 'series')) {\n \n seriesTitle = seriesTitle.replaceAmpersand();\n volumeTitle = volumeTitle.replaceAmpersand();\n\n seriesTitle = seriesTitle.toTitleCase().italicize();\n volumeTitle = volumeTitle.toTitleCase().italicize();\n\n if (seriesTitle.length > 0) {\n titlePart = titlePart.appendData(seriesTitle);\n }\n else{\n titlePart = titlePart.appendData(volumeTitle);\n }\n \n let volume = shared.getStringValue(refData.volume);\n let volumeSeperator = ', ';\n\n if (seriesTitle.length > 0) {\n if (volume.length > 0 && refData.type != 'series') {\n volume = 'Vol. ' + volume;\n titlePart = titlePart.appendData(volume, '. ');\n }\n else{\n volumeSeperator = '. ';\n }\n }\n\n if (seriesTitle.length > 0 && volumeTitle.length > 0) {\n titlePart = titlePart.appendData(volumeTitle, volumeSeperator);\n }\n else{\n titlePart = titlePart + '.';\n }\n }\n\n if (refData.type == 'series' && refData.kind == 'volume') {\n volumeTitle = volumeTitle.replaceAmpersand();\n volumeTitle = volumeTitle.toTitleCase().italicize();\n\n if (volumeTitle.length > 0) {\n titlePart = titlePart.appendData(volumeTitle);\n titlePart = titlePart + '.';\n }\n }\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n\n if (secondaryContributors.length > 0) {\n\n if ((refData.type == 'bookChapter')) {\n if (titlePart.endsWith(\".\")) {\n //replace period with comma\n titlePart = titlePart.slice(0, -1) + \",\";\n }\n else{\n titlePart = titlePart + ',';\n }\n\n //lower the first letter in contribs\n secondaryContributors = secondaryContributors.charAt(0).toLowerCase() + secondaryContributors.slice(1);\n }\n else{\n if (titlePart.length > 0 && !titlePart.endsWith('.')) {\n\n if (titlePart.endsWith('')) {\n titlePart = titlePart + ',';\n \n //lowercase the first letter of the contribs since this will have a comma\n secondaryContributors = secondaryContributors.charAt(0).toLowerCase() + secondaryContributors.slice(1);\n }\n else{\n titlePart = titlePart + '.';\n }\n }\n }\n\n titlePart = titlePart.appendData(secondaryContributors);\n }\n\n if (refData.type == 'book' && refData.kind == 'multivolume') {\n seriesTitle = shared.getStringValue(refData.seriesTitle);\n\n if (seriesTitle.length == 0) {\n let volume = shared.getStringValue(refData.volume);\n\n if (volume.length > 0) {\n volume = 'Vol. ' + volume;\n titlePart = titlePart.appendData(volume);\n }\n }\n }\n\n if (refData.type == 'bookChapter') {\n let referencePages = shared.getStringValue(refData.referencePages);\n\n if (referencePages.length > 0) {\n referencePages = shared.formatPageNumbers(referencePages, false);\n\n if (titlePart.endsWith('.')) {\n titlePart = titlePart.slice(0, -1);\n }\n\n titlePart = titlePart.appendData(referencePages, ', ', '', '', true).addClosure();\n }\n\n let volume = shared.getStringValue(refData.volume);\n\n if (refData.kind == 'multivolume') {\n \n if (volume.length > 0) {\n volume = 'Vol. ' + volume;\n titlePart = titlePart.appendData(volume);\n }\n\n seriesTitle = shared.getStringValue(refData.seriesTitle);\n\n if (seriesTitle.length > 0) {\n seriesTitle = seriesTitle.replaceAmpersand();\n seriesTitle = seriesTitle.toTitleCase().italicize();\n\n if (volume.length > 0) {\n titlePart = titlePart.appendData(seriesTitle, ' of ');\n }\n else{\n titlePart = titlePart.appendData(seriesTitle);\n }\n }\n else{\n if (volume.length > 0) {\n titlePart = titlePart.addClosure();\n }\n }\n }\n }\n\n if (refData.type == 'series' && refData.kind == 'volume') {\n let seriesVolumeText = '';\n\n seriesTitle = shared.getStringValue(refData.seriesTitle);\n\n if (seriesTitle.length > 0) {\n seriesTitle = seriesTitle.replaceAmpersand();\n seriesTitle = seriesTitle.toTitleCase();\n seriesVolumeText = seriesTitle;\n }\n\n let seriesEditors = getEditorTypeString(refData.contributors, 'series');\n\n if (seriesEditors.length > 0) {\n if (seriesVolumeText.length > 0) {\n seriesVolumeText = seriesVolumeText + ',';\n seriesEditors = seriesEditors.lowerFirstLetter();\n }\n\n seriesVolumeText = seriesVolumeText.appendData(seriesEditors);\n }\n else{\n let volume = shared.getStringValue(refData.volume);\n\n if (volume.length > 0) {\n\n if (seriesVolumeText.length == 0) {\n seriesVolumeText = seriesVolumeText.appendData('Vol.');\n }\n\n seriesVolumeText = seriesVolumeText.appendData(volume);\n seriesVolumeText = seriesVolumeText + '.';\n }\n }\n\n titlePart = titlePart.appendData(seriesVolumeText);\n }\n\n let edition = shared.getStringValue(refData.edition);\n edition = shared.fixEditionString(edition).addClosure();\n titlePart = titlePart.appendData(edition);\n\n if (refData.type == 'series') {\n\n volume = shared.getStringValue(refData.volume);\n\n if (volume.length > 0) {\n\n if (refData.kind == 'volume') {\n\n let seriesEditors = getEditorTypeString(refData.contributors, 'series');\n\n if (seriesEditors.length > 0) {\n titlePart = titlePart.addClosure();\n volume = 'Vol. ' + volume;\n titlePart = titlePart.appendData(volume);\n }\n }\n else{\n volume = volume + ' vols.'\n titlePart = titlePart.appendData(volume);\n }\n }\n }\n\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n let isTrans = isTranslated(refData);\n\n let originalPublicationDate = shared.getStringValue(refData.originalPublicationDate);\n let originalPublicationDateYear = originalPublicationDate.getYear(originalPublicationDate);\n\n // if (refData.kind != 'translated') {\n if (!isTrans) {\n publicationPart = publicationPart.appendData(originalPublicationDateYear).addClosure();\n }\n\n let publisherString = '';\n\n if (shared.isSelfPublished(refData)) {\n\n //if we have a location, we need to add that in\n let publishers = [];\n let publisher = new Object();\n\n publisher.city = refData.publishers[0].city;\n publisher.state = refData.publishers[0].state;\n publisher.type = refData.publishers[0].type;\n publisher.name = '';\n\n publishers.push(publisher);\n\n publisherString = shared.getPublisherString(publishers);\n\n if (publisherString != 'N.p.') {\n publisherString = publisherString + ': self-published';\n }\n else{\n publisherString = 'Self-published';\n }\n }\n else{\n //City, State: Publisher 1; Publisher 2; Publisher 3, publicationDate.\n publisherString = shared.getPublisherString(refData.publishers);\n }\n\n\n // if (refData.kind != 'translated') {\n //if ((!isTrans && refData.type == 'bookChapter') || (refData.kind != 'translated' && refData.type != 'bookChapter')) {\n if (!isTrans) {\n if (originalPublicationDateYear.length > 0) {\n\n //lower case when following a comma\n if (publisherString == 'Self-published') {\n publisherString = 'self-published';\n }\n\n publisherString = 'Reprint, ' + publisherString;\n }\n }\n \n publicationPart = publicationPart.appendData(publisherString);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n \n if (publicationDate.length > 0) {\n publicationDate = shared.getYear(publicationDate); \n \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n }\n else{\n if (originalPublicationDateYear.length > 0) {\n publicationPart = publicationPart.appendData(originalPublicationDateYear, ', ');\n }\n else{\n publicationPart = publicationPart.appendData('n.d.', ', ');\n }\n }\n\n publicationPart = publicationPart.addClosure();\n\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n \n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\n// function isSelfPublished(refData){\n// let isSelf = false;\n\n// let primaryType = shared.getPrimaryContributorType(refData);\n// let primaryContributors = shared.getContributorsByType(primaryType, refData.contributors);\n\n// if (primaryContributors.length == 1 && refData.publishers.length == 1) {\n// if (primaryContributors[0].type == 'groupAuthor') {\n// if (primaryContributors[0].groupName == refData.publishers[0].name) {\n// isSelf = true;\n// }\n// }\n// }\n\n// return isSelf;\n// }\n\nfunction isGenericChapterTitle(title){\n let isGeneric = false;\n let genericTitles = ['introduction', 'foreword', 'preface', 'afterword', 'prologue', 'epilogue', 'dedication', 'appendix'];\n\n isGeneric = genericTitles.includes(title.toLowerCase());\n\n return isGeneric;\n}\n\nfunction isTranslated(refData){\n\n let isTrans = false;\n\n //this keys off 2 things foreign as the kind, or the presence of a translator\n if (refData.kind == 'foreign' || refData.kind == 'translated') {\n isTrans = true;\n }\n\n let translators = shared.getContributorsByType('translator', refData.contributors);\n let chapterTranslators = shared.getContributorsByType('chapterTranslator', refData.contributors);\n\n if (translators.length > 0 || chapterTranslators.length > 0) {\n isTrans = true;\n }\n\n return isTrans;\n}\n\nfunction getVolumeEditors(contributors){\n let editorArray = [];\n\n contributors = shared.removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'volumeEditor') {\n editorArray.push(item);\n }\n });\n\n return editorArray;\n}\n\nfunction getSeriesEditors(contributors){\n let editorArray = [];\n\n contributors = shared.removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'editor') {\n editorArray.push(item);\n }\n });\n\n return editorArray;\n}\n\nfunction getEditorTypeString(contributors, type, isCitation){\n let editorString = '';\n\n if (typeof contributors === 'undefined') {\n return editorString;\n }\n\n if (typeof isCitation === 'undefined') {\n isCitation = false;\n }\n\n contributors = shared.removeEmptyContributors(contributors);\n\n let editors = [];\n\n switch (type) {\n case 'series':\n editors = getSeriesEditors(contributors);\n break;\n case 'volume':\n editors = getVolumeEditors(contributors);\n break;\n }\n\n switch (editors.length) {\n case 0:\n return '';\n break;\n case 1:\n editorString = shared.getSecondaryReferenceName(editors[0]);\n break;\n case 2:\n editorString = shared.getSecondaryReferenceName(editors[0]) + ' and ' + shared.getSecondaryReferenceName(editors[1]);\n break;\n default:\n\n let contribStringArray = [];\n\n //throw the contrib strings in an array before we build\n let counter = 1;\n _forEach(editors, (contrib) => {\n let contribString = '';\n \n contribString = shared.getSecondaryReferenceName(contrib);\n\n contribStringArray.push(contribString);\n counter++;\n });\n\n counter = 1;\n contribStringArray.forEach(contrib => {\n if (counter > 1) {\n\n if (counter == contribStringArray.length) {\n editorString = editorString + ', and '\n }\n else{\n editorString = editorString + ', ';\n }\n }\n\n editorString = editorString + contrib;\n counter++;\n });\n\n break;\n }\n\n if (isCitation) {\n return 'ed. ' + editorString;\n }\n else{\n return 'Edited by ' + editorString;\n }\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n\n if (translatedTitle.length > 0) {\n title = title.italicize();\n }\n else{\n title = title.replaceAmpersand().toTitleCase().italicize();\n } \n }\n\n titlePart = titlePart.appendData(title);\n \n translatedTitle = translatedTitle.bracket();\n titlePart = titlePart.appendData(translatedTitle);\n\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n if (shared.isSelfPublished(refData)) {\n publicationPart = publicationPart.appendData('Self-published');\n }\n else{\n let publisherString = shared.getPublisherString(refData.publishers);\n publicationPart = publicationPart.appendData(publisherString);\n }\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n \n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let title = shared.getStringValue(refData.title);\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n\n if (authorPart.length > 0) {\n title = title.toLowerCase(); \n }\n } else{\n\n if (translatedTitle.length > 0) {\n title = title.italicize();\n }\n else{\n title = title.replaceAmpersand().toTitleCase().italicize();\n } \n }\n \n if (translatedTitle.length > 0) {\n translatedTitle = translatedTitle.bracket();\n title = title.appendData(translatedTitle);\n }\n\n firstInfo = firstInfo.appendData(title, \", \");\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n // let seriesTitle = shared.getStringValue(refData.seriesTitle);\n // workTitle = workTitle.toTitleCase();\n // firstInfo = firstInfo.appendData(seriesTitle, \", \");\n\n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true);\n let publicationDate = shared.getFullDate(refData.publicationDate);\n let publisherPart = '';\n\n if (shared.isSelfPublished(refData)) {\n publisherPart = publisherPart.appendData('self-pub.');\n }\n else{\n publisherPart = publisherPart.appendData(publisherLocationString);\n }\n\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n\n publisherPart = publisherPart.parenthesis();\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n title = shared.getStringValue(refData.title);\n \n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title).shortenName();\n\n if (subsequentAuthorPart.length > 0) {\n title = title.toLowerCase();\n }\n } else{\n title = title.replaceAmpersand().shortenName().toTitleCase().italicize(); \n }\n\n subsequentInfo = subsequentInfo.appendData(title, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: false\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.title);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n titlePart = titlePart.appendData(description);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let isPublisherAndAuthorSame = shared.isPublisherAndAuthorSame(refData);\n\n let publicationPart = '';\n\n let publisherString = shared.getPublisherString(refData.publishers, 'reference', false, false);\n\n if (refData.contributors.length === 0 && publisherString.length == 0) {\n publisherString = publisherString + 'N.p.';\n }\n\n if(!isPublisherAndAuthorSame){\n publicationPart = publicationPart.appendData(publisherString);\n }\n\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n retrievalDate = shared.getFullDate(retrievalDate);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n if(publicationDate === 'n.d.'){\n \n if (retrievalDate.length > 0 && retrievalDate != 'n.d.') {\n publicationPart = publicationPart.appendData(retrievalDate, ', ', 'Accessed');\n }\n else{\n publicationPart = publicationPart.appendData(retrievalDate, ', ');\n }\n \n } else {\n publicationPart = publicationPart.appendData(publicationDate, ', ');\n }\n \n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n let isPublisherAndAuthorSame = shared.isPublisherAndAuthorSame(refData);\n\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n \n let isWorkTitleBlank = false;\n let workTitle = shared.getStringValue(refData.title);\n if(workTitle === ''){\n isWorkTitleBlank = true;\n }\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n if(!isWorkTitleBlank){\n description = description.toLowerCase();\n }\n\n firstInfo = firstInfo.appendData(description, ', ');\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n workTitle = workTitle.replaceAmpersand().toTitleCase();\n firstInfo = firstInfo.appendData(seriesTitle, \", \");\n\n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true, false);\n\n if (refData.contributors.length === 0 && publisherLocationString.length == 0) {\n publisherLocationString = 'n.p.';\n }\n\n let publicationDate = shared.getFullDate(refData.publicationDate);\n \n let publisherPart = '';\n\n if(!isPublisherAndAuthorSame){\n publisherPart = publisherPart.appendData(publisherLocationString);\n }\n\n if(publicationDate === 'n.d.'){\n // there isn't a publication date, check for a retrevial date\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n retrievalDate = shared.getFullDate(retrievalDate);\n\n if (retrievalDate.length > 0 && retrievalDate != 'n.d.') {\n publisherPart = publisherPart.appendData(retrievalDate, ', ', 'accessed');\n }\n else{\n publisherPart = publisherPart.appendData(retrievalDate, ', ');\n }\n \n } else {\n // publicationPart = publicationPart.appendData(publicationDate, ', ');\n \n publisherPart = publisherPart.appendData(publicationDate, ', ');\n }\n\n // publisherPart = publisherPart.parenthesis();\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n let subsequentWorkTitle = '';\n\n if(isWorkTitleBlank){\n subsequentWorkTitle = shared.getStringValue(refData.description);\n subsequentWorkTitle = subsequentWorkTitle.shortenName();\n } else {\n subsequentWorkTitle = shared.getStringValue(refData.title);\n\n if (subsequentWorkTitle.startsWith('[')) {\n subsequentWorkTitle = shared.removeDescriptionFromTitle(subsequentWorkTitle).shortenName();\n } else{\n subsequentWorkTitle = subsequentWorkTitle.replaceAmpersand().shortenName().toTitleCase().doubleQuote(); \n }\n \n }\n\n subsequentInfo = subsequentInfo.appendData(subsequentWorkTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.title);\n\n // if this is a description, remove the brackets\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote();\n }\n\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n \n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n if(type === 'conference') {\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n locationPart = locationPart.appendData(description);\n\n let conference = shared.getStringValue(refData.conference);\n locationPart = locationPart.appendData(conference, ', ');\n\n } else if(type === 'symposium') {\n\n let chairs = getChairs(refData.contributors);\n let hasNonOtherContribs = hasNonChairContributors(refData.contributors);\n\n if (chairs.length > 0 && hasNonOtherContribs) {\n let chairsString = shared.getSecondaryContributorTypeString(chairs, 'chair');\n chairsString = chairsString.addClosure();\n locationPart = locationPart.appendData(chairsString, ', ');\n }\n\n let symposiumTitle = shared.getStringValue(refData.symposiumTitle);\n symposiumTitle = symposiumTitle.replaceAmpersand().toTitleCase();\n\n if (chairs.length > 0) {\n locationPart = locationPart.appendData(symposiumTitle);\n }\n else{\n locationPart = locationPart.appendData(symposiumTitle, ', ');\n }\n\n locationPart = locationPart.addClosure();\n\n let conference = shared.getStringValue(refData.conference);\n locationPart = locationPart.appendData(conference, ' ', 'Symposium at');\n\n }\n\n let city = shared.getStringValue(refData.city);\n locationPart = locationPart.appendData(city, ', ');\n\n let state = shared.getStringValue(refData.state);\n locationPart = locationPart.appendData(state, ', ');\n \n let country = shared.getStringValue(refData.country);\n if (\n country.length > 0 &&\n (country !== 'US' && country !== 'USA' && country !== 'United States' && country !== 'United States of America')\n ) {\n locationPart = locationPart.appendData(country, ', ');\n }\n\n let formattedDate = getConferenceDateRange(refData);\n locationPart = locationPart.appendData(formattedDate, ', ');\n \n locationPart = locationPart.addClosure();\n\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\n\nfunction getConferenceDateRange(refData){\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let endDate = shared.getStringValue(refData.endDate);\n let formattedDate = '';\n\n if (endDate.length > 0) {\n formattedDate = shared.getFullDateRange(publicationDate, endDate);\n }\n else{\n formattedDate = shared.getFullDate(publicationDate);\n }\n\n return formattedDate;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let workTitle = shared.getStringValue(refData.title);\n\n // if this is a description, remove the brackets\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote();\n }\n \n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let parenthesisPart = '';\n\n if(type === 'conference') {\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n description = description.toLowerCase();\n parenthesisPart = parenthesisPart.appendData(description, ', ');\n \n let conference = shared.getStringValue(refData.conference);\n parenthesisPart = parenthesisPart.appendData(conference, ', ');\n\n } else if(type === 'symposium') {\n\n let chairs = getChairs(refData.contributors);\n let hasNonOtherContribs = hasNonChairContributors(refData.contributors);\n\n if (chairs.length > 0 && hasNonOtherContribs) {\n let chairsString = shared.getSecondaryContributorTypeString(chairs, 'chair');\n\n if (chairs.length == 1) {\n chairsString = chairsString.replace(\"Chaired by\", 'chair,');\n }\n else{\n chairsString = chairsString.replace(\"Chaired by\", 'chairs,');\n }\n\n firstInfo = firstInfo.appendData(chairsString, ', ');\n }\n\n let symposiumTitle = shared.getStringValue(refData.symposiumTitle);\n symposiumTitle = symposiumTitle.replaceAmpersand().toTitleCase();\n firstInfo = firstInfo.appendData(symposiumTitle, ', ');\n\n let conference = shared.getStringValue(refData.conference);\n parenthesisPart = parenthesisPart.appendData(conference, ' ', 'symposium at');\n\n }\n \n let city = shared.getStringValue(refData.city);\n parenthesisPart = parenthesisPart.appendData(city, ', ');\n\n let state = shared.getStringValue(refData.state);\n parenthesisPart = parenthesisPart.appendData(state, ', ');\n\n let country = shared.getStringValue(refData.country);\n if (\n country.length > 0 &&\n (country !== 'US' && country !== 'USA' && country !== 'United States' && country !== 'United States of America')\n ) {\n parenthesisPart = parenthesisPart.appendData(country, ', ');\n }\n\n let formattedDate = getConferenceDateRange(refData);\n parenthesisPart = parenthesisPart.appendData(formattedDate, ', ');\n parenthesisPart = parenthesisPart.parenthesis();\n firstInfo = firstInfo.appendData(parenthesisPart, ', ');\n \n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.title);\n\n // if this is a description, remove the brackets\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n workTitle = workTitle.shortenName();\n } else{\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().doubleQuote();\n }\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}\n\nfunction getChairs(contributors){\n let editorArray = [];\n\n contributors = shared.removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'chair') {\n editorArray.push(item);\n }\n });\n\n return editorArray;\n}\n\nfunction hasNonChairContributors(contributors){\n let has = false;\n\n contributors = shared.removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type !== 'chair') {\n has = true;\n }\n });\n\n return has;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n \n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n switch(type){\n case 'us':\n titlePart = titlePart.appendData('U.S. Constitution.');\n break;\n case 'state':\n let state = shared.getStringValue(refData.state);\n titlePart = titlePart.appendData(state, '', '', 'Constitution.');\n break;\n case 'charter':\n let title = shared.getStringValue(refData.title);\n titlePart = titlePart.appendData(title);\n titlePart = titlePart.addClosure();\n\n // charter doesn't have a kind so it will skip the below step\n let charterArticle = shared.getStringValue(refData.charterArticle);\n charterArticle = convertRomanNumerals(charterArticle);\n titlePart = titlePart.appendData(charterArticle, ' ', 'art.');\n\n let paragraph = shared.getStringValue(refData.paragraph);\n paragraph = convertRomanNumerals(paragraph);\n titlePart = titlePart.appendData(paragraph, ', ', 'para.');\n\n break;\n }\n\n if(type === 'us' || type === 'state'){\n // grab some data that will get injected in different orders based on kind\n let amendment = shared.getStringValue(refData.amendment);\n if(amendment.length > 0){\n amendment = convertRomanNumerals(amendment);\n }\n let section = shared.getStringValue(refData.section);\n if(section.length > 0){\n section = convertRomanNumerals(section);\n }\n\n switch(kind){\n case 'article':\n let article = shared.getStringValue(refData.article);\n if(article.length > 0){\n article = convertRomanNumerals(article);\n titlePart = titlePart.appendData(article, ' ', 'art.');\n }\n\n if(section.length > 0){\n titlePart = titlePart.appendData(section, ', ', 'sec.');\n }\n break;\n case 'amendment':\n if(amendment.length > 0){\n titlePart = titlePart.appendData(amendment, ' ', 'amend.');\n }\n if(section.length > 0){\n titlePart = titlePart.appendData(section, ', ', 'sec.');\n }\n break;\n case 'repealed':\n if(amendment.length > 0){\n titlePart = titlePart.appendData(amendment, ' ', 'amend.');\n }\n titlePart = titlePart.appendData(section, ', ', 'sec.');\n\n let repealDate = shared.getStringValue(refData.repealDate);\n repealDate = shared.getFullDate(repealDate);\n let parenthesisPart = '';\n parenthesisPart = parenthesisPart.appendData(repealDate, ' ', 'repealed');\n parenthesisPart = parenthesisPart.parenthesis();\n titlePart = titlePart.appendData(parenthesisPart);\n break;\n }//e:switch\n }//e:if\n\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getCitationTitle(refData){\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n switch(type){\n case 'us':\n firstInfo = firstInfo.appendData('U.S. Constitution.');\n break;\n case 'state':\n let state = shared.getStringValue(refData.state);\n firstInfo = firstInfo.appendData(state, '', '', 'Constitution.');\n break;\n case 'charter':\n let title = shared.getStringValue(refData.title);\n firstInfo = firstInfo.appendData(title);\n firstInfo = firstInfo.addClosure();\n\n // charter doesn't have a kind so it will skip the below step\n let charterArticle = shared.getStringValue(refData.charterArticle);\n charterArticle = convertRomanNumerals(charterArticle);\n firstInfo = firstInfo.appendData(charterArticle, ' ', 'art.');\n\n let paragraph = shared.getStringValue(refData.paragraph);\n paragraph = convertRomanNumerals(paragraph);\n firstInfo = firstInfo.appendData(paragraph, ', ', 'para.');\n\n break;\n }\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n if(type === 'us' || type === 'state'){\n // grab some data that will get injected in different orders based on kind\n let amendment = shared.getStringValue(refData.amendment);\n if(amendment.length > 0){\n amendment = convertRomanNumerals(amendment);\n }\n let section = shared.getStringValue(refData.section);\n if(section.length > 0){\n section = convertRomanNumerals(section);\n }\n\n switch(kind){\n case 'article':\n let article = shared.getStringValue(refData.article);\n if(article.length > 0){\n article = convertRomanNumerals(article);\n firstInfo = firstInfo.appendData(article, ' ', 'art.');\n }\n if(section.length > 0){\n firstInfo = firstInfo.appendData(section, ', ', 'sec.');\n }\n break;\n case 'amendment':\n if(amendment.length > 0){\n firstInfo = firstInfo.appendData(amendment, ' ', 'amend.');\n }\n if(section.length > 0){\n firstInfo = firstInfo.appendData(section, ', ', 'sec.');\n }\n break;\n case 'repealed':\n if(amendment.length > 0){\n firstInfo = firstInfo.appendData(amendment, ' ', 'amend.');\n }\n if(section.length > 0){\n firstInfo = firstInfo.appendData(section, ', ', 'sec.');\n }\n\n let repealDate = shared.getStringValue(refData.repealDate);\n repealDate = shared.getFullDate(repealDate);\n let parenthesisPart = '';\n parenthesisPart = parenthesisPart.appendData(repealDate, ' ', 'repealed');\n parenthesisPart = parenthesisPart.parenthesis();\n firstInfo = firstInfo.appendData(parenthesisPart);\n break;\n }\n }\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n // let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n // subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.workTitle);\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().italicize();\n\n // subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n // subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n \n subsequentInfo = firstInfo;\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}\n\n// https://medium.com/swlh/how-to-build-a-roman-numeral-to-integer-function-in-javascript-8298657a26f7\nfunction convertRomanNumerals(input){\n // input should be a range like II–V, start by converting that into an array\n let fixedInput = shared.fixPageDash(input);\n let rangeArray = fixedInput.split('–');\n\n let outputString = '';\n\n const romanHash = {\n I: 1,\n V: 5,\n X: 10,\n L: 50,\n C: 100,\n D: 500,\n M: 1000,\n };\n \n // loop through each rangeArray to build an output string\n _forEach(rangeArray, (singleRange, index)=>{\n // check this to see if it's a real number like 3, or roman numberals like III\n if(isNaN(parseFloat(singleRange))){\n // this is a roman number like III\n\n let accumulator = 0;\n\n // loop through each digit in this range (if it was IV, this would be a single I first, then a single V in the second loop)\n for (let i = 0; i < singleRange.length; i++) {\n if (singleRange[i] === \"I\" && singleRange[i + 1] === \"V\") {\n accumulator += 4;\n i++;\n } else if (singleRange[i] === \"I\" && singleRange[i + 1] === \"X\") {\n accumulator += 9;\n i++;\n } else if (singleRange[i] === \"X\" && singleRange[i + 1] === \"L\") {\n accumulator += 40;\n i++;\n } else if (singleRange[i] === \"X\" && singleRange[i + 1] === \"C\") {\n accumulator += 90;\n i++;\n } else if (singleRange[i] === \"C\" && singleRange[i + 1] === \"D\") {\n accumulator += 400;\n i++;\n } else if (singleRange[i] === \"C\" && singleRange[i + 1] === \"M\") {\n accumulator += 900;\n i++;\n } else {\n accumulator += romanHash[singleRange[i]];\n\n }\n } // e:for\n\n outputString += accumulator.toString();\n\n } else {\n // this a real number like 3\n outputString += singleRange;\n\n } //e:if\n \n // not the last item - add a dash\n if(rangeArray.length >= 2 && index < rangeArray.length - 1){\n outputString += '–';\n }\n \n });//e:forEach\n \n return outputString;\n \n}//e:convertRomanNumerals","const shared = require('./Turabian9-Shared.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n\n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n if(refData.type === 'raw') {\n let retrievalDatePart = '';\n\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n if (retrievalDate.length > 0) {\n retrievalDatePart = shared.getFullDate(retrievalDate);\n retrievalDatePart = retrievalDatePart.addClosure();\n referenceValue = referenceValue.appendData(retrievalDatePart, ' ', 'Accessed');\n }\n\t}\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n if (title.length > 0) {\n // if this is a description, remove the brackets and don't italicize\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n title = title.replaceAmpersand().toTitleCase().italicize();\n \n }\n }\n titlePart = titlePart.appendData(title);\n titlePart = titlePart.addClosure();\n\n let version = shared.getStringValue(refData.version);\n titlePart = titlePart.appendData(version);\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n // puting Label here passes test 9 but breaks test 1\n\n if (shared.isSelfPublished(refData)) {\n publicationPart = publicationPart.appendData('Self-published');\n }\n else{\n let publisherString = shared.getPublisherString(refData.publishers);\n publicationPart = publicationPart.appendData(publisherString);\n }\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n\n if (publicationDate.length > 0 && publicationDate != 'n.d.') {\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n }\n\n publicationPart = publicationPart.addClosure();\n\n // puting Label here passes test 1 but breaks test 9\n let label = '';\n switch (refData.type) {\n case 'published':\n label = 'Dataset';\n break;\n case 'raw':\n label = 'Unpublished raw data';\n break;\n }\n publicationPart = publicationPart.appendData(label);\n publicationPart = publicationPart.addClosure();\n\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let workTitle = shared.getStringValue(refData.title);\n if (workTitle.length > 0) {\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n }\n }\n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n description = description.toLowerCase();\n firstInfo = firstInfo.appendData(description, ', ');\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n workTitle = workTitle.replaceAmpersand().toTitleCase();\n firstInfo = firstInfo.appendData(seriesTitle, \", \");\n\n let version = shared.getStringValue(refData.version);\n firstInfo = firstInfo.appendData(version, \", \");\n \n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true);\n let publicationDate = shared.getFullDate(refData.publicationDate);\n let publisherPart = '';\n\n if (shared.isSelfPublished(refData)) {\n publisherPart = publisherPart.appendData('self-published');\n } else{\n publisherPart = publisherPart.appendData(publisherLocationString);\n }\n\n if (publicationDate.length > 0 && publicationDate != 'n.d.') {\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n publisherPart = publisherPart.parenthesis();\n }\n\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n\n // label\n switch (refData.type) {\n case 'published':\n firstInfo = firstInfo.appendData('dataset', ', ');\n break;\n case 'raw':\n firstInfo = firstInfo.appendData('unpublished raw data', ', ');\n break;\n }\n\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi);\n firstInfo= firstInfo.appendData(doi, ', ');\n } else{\n if (url.length > 0) {\n // url = shared.formatURL(url).addClosure();\n url = shared.formatURL(url);\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n let retrievalDatePart = '';\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n if (retrievalDate.length > 0) {\n retrievalDatePart = shared.getFullDate(retrievalDate);\n firstInfo = firstInfo.appendData(retrievalDatePart, ', ', 'accessed');\n\t}\n\n firstInfo = firstInfo.addClosure();\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.title);\n if (workTitle.length > 0) {\n // if this is a description, remove the brackets and don't italicize\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle).shortenName();\n } else{\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().italicize();\n \n }\n }\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nlet useDescriptionForTitle = false; // set as a flag here so i can not include the descritpion later\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.title);\n\n // if this is a description, remove the brackets\n if (workTitle.startsWith('[')) {\n useDescriptionForTitle = true;\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n useDescriptionForTitle = false;\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote();\n }\n\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n titlePart = titlePart.appendData(description);\n titlePart = titlePart.addClosure();\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n seriesTitle = seriesTitle.replaceAmpersand().toTitleCase();\n titlePart = titlePart.appendData(seriesTitle);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n \n // let publisherString = shared.getPublisherString(refData.publishers);\n // publicationPart = publicationPart.appendData(publisherString);\n\n let kind = shared.getStringValue(refData.kind);\n\n \n if(kind === 'doctorate'){\n publicationPart = publicationPart.appendData('PhD diss.');\n } else {\n publicationPart = publicationPart.appendData('Master\\'s thesis');\n }\n\n let institution = shared.getStringValue(refData.institution);\n publicationPart = publicationPart.appendData(institution, ', ');\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate).upperFirstLetter(); \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n \n //record\n let record = shared.getStringValue(refData.record);\n record = shared.fixFormatString(record);\n locationPart = locationPart.appendData(record).addClosure();\n\n //database\n let database = shared.getStringValue(refData.database);\n database = shared.fixFormatString(database);\n locationPart = locationPart.appendData(database).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let workTitle = shared.getStringValue(refData.title);\n\n // if this is a description, remove the brackets\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n workTitle = workTitle.addClosure();\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote();\n }\n\n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n description = description.toLowerCase();\n firstInfo = firstInfo.appendData(description, ', ');\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n workTitle = workTitle.replaceAmpersand().toTitleCase();\n firstInfo = firstInfo.appendData(seriesTitle, \", \");\n\n let publisherPart = '';\n\n let kind = shared.getStringValue(refData.kind);\n if(kind === 'doctorate'){\n publisherPart = publisherPart.appendData('PhD diss.');\n } else {\n publisherPart = publisherPart.appendData('master\\'s thesis');\n }\n \n let institution = shared.getStringValue(refData.institution);\n publisherPart = publisherPart.appendData(institution, ', ');\n \n // let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true);\n \n // publisherPart = publisherPart.appendData(publisherLocationString);\n let publicationDate = shared.getFullDate(refData.publicationDate);\n publicationDate = publicationDate.upperFirstLetter();\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n \n if(useDescriptionForTitle){\n firstInfo = firstInfo.appendData(publisherPart);\n } else {\n publisherPart = publisherPart.parenthesis();\n firstInfo = firstInfo.appendData(publisherPart, ', '); \n }\n\n // record\n let record = shared.getStringValue(refData.record);\n record = shared.fixFormatString(record);\n firstInfo = firstInfo.appendData(record, ', ');\n\n // database\n let database = shared.getStringValue(refData.database);\n database = shared.fixFormatString(database);\n firstInfo = firstInfo.appendData(database, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.title);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle).shortenName();\n workTitle = workTitle.addClosure();\n } else{\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().doubleQuote();\n \n }\n\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","module.exports = {\n getReference,\n getCitation\n}\n \nfunction getReference(type, refData){\n var typeEngine = getTypeEngine(type);\n var reference = typeEngine.getReference(refData);\n \n return reference;\n}\n\nfunction getCitation(type, refData, citationData, paperRefs){\n var typeEngine = getTypeEngine(type);\n var citation = typeEngine.getCitation(refData, citationData, paperRefs);\n \n //add the brackets around the citation\n // if (citation.first.length > 0) {\n // citation.first = \"(\" + citation.first + \")\"; \n // }\n \n // if (citation.subsequent.length > 0) {\n // citation.subsequent = \"(\" + citation.subsequent + \")\"; \n // }\n\n return citation;\n}\n\nfunction getTypeEngine(type){\n var typeEngine = null;\n\n typeEngine = require('./Turabian9-' + type +'.js');\n\n return typeEngine;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n //Executive Order [orderNumber]. \\”[title].\\”\n titlePart = titlePart.appendData('Executive Order');\n\n let orderNumber = shared.getStringValue(refData.orderNumber);\n titlePart = titlePart.appendData(orderNumber);\n titlePart = titlePart.addClosure();\n\n let title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n title = title.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n titlePart = titlePart.appendData(title);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n // Code of Federal Regulations, title 3 ([publicationDate] comp.): [pageNumber].\n publicationPart = publicationPart.appendData(\"Code of Federal Regulations, title 3\");\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getYear(publicationDate); \n \n if (publicationDate.length > 0) {\n publicationPart = publicationPart.appendData(publicationDate, ' (', '', 'comp.)');\n }\n \n let pageNumber = shared.getStringValue(refData.pageNumber);\n publicationPart = publicationPart.appendData(pageNumber, ': ');\n\n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n \n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = 'Executive Order';\n\n let orderNumber = shared.getStringValue(refData.orderNumber);\n\n if (orderNumber.length > 0) {\n citationTitle = citationTitle + ' ' + orderNumber;\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'orderNumber';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n firstInfo = firstInfo.appendData('Executive Order', \", \");\n\n let orderNumber = shared.getStringValue(refData.orderNumber);\n firstInfo = firstInfo.appendData(orderNumber);\n\n let title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n title = title.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n firstInfo = firstInfo.appendData(title, ', ');\n firstInfo = firstInfo.appendData(\"Code of Federal Regulations, title 3\", \", \");\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getYear(publicationDate); \n \n if (publicationDate.length > 0) {\n firstInfo = firstInfo.appendData(publicationDate, ' (', '', 'comp.)');\n }\n\n let pageNumber = shared.getStringValue(refData.pageNumber);\n let citationLocation = shared.getCitationLocationString(citationData, false);\n\n if (citationLocation.length > 0) {\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n }\n else{\n if (pageNumber.length > 0) {\n firstInfo = firstInfo.appendData(pageNumber, ', ');\n }\n }\n \n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n subsequentInfo = subsequentInfo.appendData('Executive Order', \", \");\n subsequentInfo = subsequentInfo.appendData(orderNumber);\n\n if (citationLocation.length > 0) {\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n }\n else{\n if (pageNumber.length > 0) {\n subsequentInfo = subsequentInfo.appendData(pageNumber, ', ');\n }\n }\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}\n\nfunction getAuthorPart(refData){\n let contributorstring = '';\n\n if (typeof refData.contributors === 'undefined') {\n return contributorstring;\n }\n\n let contributors = refData.contributors;\n contributors = shared.removeEmptyContributors(contributors);\n\n if (contributors.length > 0) {\n\n let primaryContributors = shared.getContributorsByType('author', contributors);\n\n //this is for president, so can only be one\n //just grab the first one can move on\n\n if (primaryContributors.length > 0) {\n \n contributor = primaryContributors[0];\n\n if(contributor.firstName){\n contributorstring = contributor.firstName.trim();\n }\n\n if (contributor.middleName) {\n if (contributor.middleName.trim().length > 0) {\n if (contributor.middleName.includes(\" \")) {\n let middleArray = contributor.middleName.split(\" \");\n let middleNameString = \"\";\n \n for (var i = 0; i < middleArray.length; i++) {\n if (middleNameString.length > 0) {\n middleNameString = middleNameString + \" \";\n }\n \n middleNameString = middleNameString + middleArray[i].getInitial();\n }\n \n contributorstring = contributorstring + ' ' + middleNameString;\n }\n else{\n contributorstring = contributorstring + ' ' + contributor.middleName.getInitial();\n }\n }\n }\n\n if(contributor.lastName){\n\n if (contributor.lastName.trim().length > 0) {\n if (contributorstring.length > 0) {\n contributorstring = contributorstring + ' ';\n }\n \n contributorstring = contributorstring + contributor.lastName.trim(); \n }\n }\n } \n\n }\n\n return contributorstring.addClosure();\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let titlePart = getTitlePart(refData);\n let contributorPart = getContributorPart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(contributorPart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(titlePart),\n authorPartNoLabel: String(titlePart),\n authorPartSort: String(titlePart),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n title = title.replaceAmpersand().toTitleCase().italicize(); \n }\n\n titlePart = titlePart.appendData(title);\n\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (translatedTitle.startsWith('[')) {\n translatedTitle = shared.removeDescriptionFromTitle(translatedTitle);\n } else{\n translatedTitle = translatedTitle.replaceAmpersand().toTitleCase().bracket(); \n }\n\n titlePart = titlePart.appendData(translatedTitle);\n\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getContributorPart(refData){\n let contributorPart = '';\n\n let contributors = getCustomContributorString(refData);\n contributorPart = contributorPart.appendData(contributors);\n contributorPart = contributorPart.addClosure();\n\n return contributorPart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let publisherString = shared.getPublisherString(refData.publishers, 'reference', false, false);\n\n if (publisherString.length == 0) {\n publisherString = 'N.p.'\n }\n\n publicationPart = publicationPart.appendData(publisherString);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n \n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //runtime\n let runtime = shared.getStringValue(refData.runtime);\n let formattedRunTime = formatRunTime(runtime);\n locationPart = locationPart.appendData(formattedRunTime).addClosure();\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle);\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n } else{\n citationTitle = citationTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let firstInfo = '';\n let subsequentInfo = '';\n\n let workTitle = shared.getStringValue(refData.title);\n \n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (translatedTitle.length > 0) {\n\n if (translatedTitle.startsWith('[')) {\n translatedTitle = shared.removeDescriptionFromTitle(translatedTitle);\n } else{\n translatedTitle = translatedTitle.replaceAmpersand().toTitleCase().bracket(); \n }\n\n workTitle = workTitle.appendData(translatedTitle);\n }\n\n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n let contributors = getCustomContributorString(refData, true);\n contributors = contributors.lowerFirstLetter();\n firstInfo = firstInfo.appendData(contributors, \", \");\n\n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true, false);\n\n if (publisherLocationString.length == 0) {\n publisherLocationString = 'N.p.';\n }\n\n let publicationDate = shared.getFullDate(refData.publicationDate);\n let publisherPart = '';\n\n publisherPart = publisherPart.appendData(publisherLocationString);\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n\n publisherPart = publisherPart.parenthesis();\n \n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n workTitle = shared.getStringValue(refData.title);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle).shortenName();\n } else{\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().italicize(); \n }\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}\n\nfunction getCustomContributorString(refData, isCitation){\n let contributorstring = '';\n\n if (typeof refData.contributors === 'undefined') {\n return contributorstring;\n }\n\n if (typeof isCitation === 'undefined') {\n isCitation = false;\n }\n\n let seperator = '. ';\n\n if (isCitation) {\n seperator = ', '\n }\n\n //https://docs.google.com/document/d/1i8JTgpxic3-mJjC2CDK1G0yJHBhS5clHyp8eVNi8OGY/edit#heading=h.2qotezq9birt\n \n let contributors = refData.contributors;\n\n contributors = shared.removeEmptyContributors(contributors);\n\n if (contributors.length > 0) {\n\n //start by getting the directors\n let directors = getDirectors(refData.contributors);\n let customs = shared.getContributorsByType('custom', refData.contributors, false);\n\n if (directors.length > 0) {\n let directorsString = shared.getSecondaryContributorTypeString(directors, 'director');\n contributorstring = contributorstring.appendData(directorsString);\n }\n\n if (customs.length > 0) {\n let actorContribs = getCustomContributorByName(customs, ['Actor', 'Actress']);\n let producerContribs = getCustomContributorByName(customs, ['Producer', 'Executive Producer']);\n let writerContribs = getCustomContributorByName(customs, ['Writer']);\n let hostContribs = getCustomContributorByName(customs, ['Host']);\n let narratorContribs = getCustomContributorByName(customs, ['Narrator']);\n let otherContribs = getCustomContributorByName(customs, []);\n\n if (actorContribs.length > 0) {\n let actorsString = shared.getSecondaryContributorTypeString(actorContribs, 'actor');\n contributorstring = contributorstring.appendData(actorsString, seperator);\n }\n\n if (producerContribs.length > 0) {\n let producerString = shared.getSecondaryContributorTypeString(producerContribs, 'producer', '.');\n contributorstring = contributorstring.appendData(producerString, seperator);\n }\n\n if (writerContribs.length > 0) {\n let writerString = shared.getSecondaryContributorTypeString(writerContribs, 'writer');\n contributorstring = contributorstring.appendData(writerString, seperator);\n }\n\n if (hostContribs.length > 0) {\n let hostString = shared.getSecondaryContributorTypeString(hostContribs, 'host');\n contributorstring = contributorstring.appendData(hostString, seperator);\n }\n\n if (narratorContribs.length > 0) {\n let narratorString = shared.getSecondaryContributorTypeString(narratorContribs, 'narrator');\n contributorstring = contributorstring.appendData(narratorString, seperator);\n }\n\n if (otherContribs.length > 0) {\n _forEach(otherContribs, (item) => {\n let customString = shared.getSecondaryContributorTypeString([item], 'custom');\n contributorstring = contributorstring.appendData(customString, seperator);\n });\n }\n }\n }\n\n return contributorstring;\n}\n\nfunction formatRunTime(runtime){\n let formattedRunTime = '';\n\n if (runtime.length > 0) {\n if(runtime.includes(':')){\n let timeArray = runtime.split(':');\n\n // the time array can be different lengths based on data we get at this point\n switch(timeArray.length){\n case 1: // MM (assumed)\n return timeArray[0] + ' min.';\n \n case 2: // HH:MM (assumed)\n return parseInt(timeArray[0]) + ' hr., ' + timeArray[1]+ ' min.';\n }\n } else {\n return runtime;\n }\n }\n\n return formattedRunTime;\n}\n\nfunction getCustomContributorByName(contributors, names) {\n\n let namedContribs = [];\n\n if (names.length == 0) {\n //if an empty array is returned, only return those that are not in the known list\n _forEach(contributors, (item) => {\n if (item.name.toLowerCase() !== 'actor' &&\n item.name.toLowerCase() !== 'actress' &&\n item.name.toLowerCase() !== 'producer' &&\n item.name.toLowerCase() !== 'executive producer' &&\n item.name.toLowerCase() !== 'writer' &&\n item.name.toLowerCase() !== 'host' &&\n item.name.toLowerCase() !== 'narrator' &&\n item.name.toLowerCase() !== 'associate director'\n ) {\n namedContribs.push(item);\n }\n });\n }\n else{\n _forEach(contributors, (item) => {\n\n _forEach(names, (name) => {\n if (item.name.toLowerCase() == name.toLowerCase()) {\n namedContribs.push(item);\n }\n });\n });\n }\n\n return namedContribs;\n}\n\nfunction getDirectors(contributors){\n let directors = [];\n\n //this can be an Author, Director, or \n //Custom with Associate Director\n\n _forEach(contributors, (item) => {\n \n if (item.type == 'author') {\n directors.push(item);\n }\n\n if (item.type == 'director') {\n directors.push(item);\n }\n\n if (item.type == 'custom') {\n\n if (typeof item.name !== 'undefined') {\n if (item.name.toLowerCase() == 'associate director') {\n directors.push(item);\n }\n }\n }\n \n })\n\n return directors;\n}\n","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.title);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n titlePart = titlePart.appendData(description);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n \n if (isSelfPublished(refData)) {\n publicationPart = publicationPart.appendData('Self-published');\n } else{\n let publisherString = shared.getPublisherString(refData.institution, 'reference', false, true);\n publicationPart = publicationPart.appendData(publisherString);\n }\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n publicationPart = publicationPart.addClosure();\n\n publicationPart = publicationPart.appendData('Grant.');\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let workTitle = shared.getStringValue(refData.title);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n workTitle = workTitle.toLowerCase();\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n description = description.customLowerCase();\n firstInfo = firstInfo.appendData(description, ', ');\n \n let publisherLocationString = shared.getPublisherString(refData.institution, 'reference', true);\n let publicationDate = shared.getFullDate(refData.publicationDate);\n let publisherPart = '';\n\n if (isSelfPublished(refData)) {\n publisherPart = publisherPart.appendData('self-pub.');\n }\n else{\n publisherPart = publisherPart.appendData(publisherLocationString);\n }\n \n publisherPart = publisherPart.appendData(publicationDate, ', ');\n publisherPart = publisherPart.parenthesis();\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n firstInfo = firstInfo.appendData('grant', ', '); \n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n \n let subsequentWorkTitle = shared.getStringValue(refData.title);\n if (subsequentWorkTitle.startsWith('[')) {\n subsequentWorkTitle = shared.removeDescriptionFromTitle(subsequentWorkTitle);\n subsequentWorkTitle = subsequentWorkTitle.shortenName().toLowerCase();\n } else{\n subsequentWorkTitle = shared.getStringValue(refData.title);\n subsequentWorkTitle = subsequentWorkTitle.replaceAmpersand().shortenName().toTitleCase().italicize();\n }\n\n \n\n subsequentInfo = subsequentInfo.appendData(subsequentWorkTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}\n\n//using a copy instead of shared....this type doesnt have publishers, but institutions\nfunction isSelfPublished(refData){\n let isSelf = false;\n\n let primaryType = shared.getPrimaryContributorType(refData);\n let primaryContributors = shared.getContributorsByType(primaryType, refData.contributors);\n\n if (typeof refData.institution === 'undefined') {\n return false;\n }\n\n if (primaryContributors.length == 1 && refData.institution.length == 1) {\n if (primaryContributors[0].type == 'groupAuthor') {\n if (primaryContributors[0].groupName == refData.institution[0].name) {\n isSelf = true;\n }\n }\n }\n\n return isSelf;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.workTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n titlePart = titlePart.appendData(description);\n titlePart = titlePart.addClosure();\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n\n if (seriesTitle.startsWith('[')) {\n seriesTitle = shared.removeDescriptionFromTitle(seriesTitle);\n } else{\n seriesTitle = seriesTitle.replaceAmpersand().toTitleCase(); \n }\n\n titlePart = titlePart.appendData(seriesTitle);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n if (shared.isSelfPublished(refData)) {\n publicationPart = publicationPart.appendData('Self-published');\n }\n else{\n let publisherString = shared.getPublisherString(refData.publishers);\n publicationPart = publicationPart.appendData(publisherString);\n }\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n \n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let workTitle = shared.getStringValue(refData.workTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n description = description.toLowerCase();\n firstInfo = firstInfo.appendData(description, ', ');\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n\n if (seriesTitle.startsWith('[')) {\n seriesTitle = shared.removeDescriptionFromTitle(seriesTitle);\n } \n\n firstInfo = firstInfo.appendData(seriesTitle, \", \");\n\n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true);\n let publicationDate = shared.getFullDate(refData.publicationDate);\n let publisherPart = '';\n\n if (shared.isSelfPublished(refData)) {\n publisherPart = publisherPart.appendData('self-pub.');\n }\n else{\n publisherPart = publisherPart.appendData(publisherLocationString);\n }\n\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n\n publisherPart = publisherPart.parenthesis();\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.workTitle);\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().italicize();\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.workTitle);\n\n if (workTitle) {\n // work title has content\n // if this is a description, remove the brackets\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote();\n }\n } else {\n // work title is blank, try to grab the description\n workTitle = shared.getStringValue(refData.description);\n if (workTitle) {\n workTitle = workTitle.addClosure();\n }\n }\n\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n let publisherString = shared.getPublisherStringInverted(refData.publishers);\n\n if (publisherString != 'N.p.') {\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n publicationDate = publicationDate.upperFirstLetter();\n titlePart = titlePart.appendData(publicationDate);\n titlePart = titlePart.addClosure();\n }\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n titlePart = titlePart.appendData(description);\n titlePart = titlePart.addClosure();\n\n // publishers here are different for informal works than other places\n titlePart = titlePart.appendData(publisherString);\n titlePart = titlePart.addClosure();\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n seriesTitle = seriesTitle.replaceAmpersand().toTitleCase();\n titlePart = titlePart.appendData(seriesTitle);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let workTitle = shared.getStringValue(refData.workTitle);\n \n if (workTitle) {\n // work title has content\n // if this is a description, remove the brackets\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n\n if (firstInfo.length > 0) {\n workTitle = workTitle.lowerFirstLetter();\n }\n\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote();\n \n }\n } else {\n // work title is blank, try to grab the description\n workTitle = shared.getStringValue(refData.description);\n if (workTitle) {\n workTitle = workTitle.upperFirstLetter();\n workTitle = workTitle.addClosure();\n }\n }\n firstInfo = firstInfo.appendData(workTitle, \", \");\n \n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let publisherLocationString = shared.getPublisherStringInverted(refData.publishers, true);\n\n if (publisherLocationString != 'n.p.') {\n let publicationDate = shared.getFullDate(refData.publicationDate);\n firstInfo = firstInfo.appendData(publicationDate, ', ');\n }\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n firstInfo = firstInfo.appendData(description, ', ');\n\n firstInfo = firstInfo.appendData(publisherLocationString, ', ');\n \n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n workTitle = workTitle.replaceAmpersand().toTitleCase();\n firstInfo = firstInfo.appendData(seriesTitle, \", \");\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \" \", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.workTitle);\n\n if (workTitle) {\n // work title has content\n // if this is a description, remove the brackets\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle).shortenName();\n // .toTitleCase().doubleQuote(); // double quotes for Test 7 and 8 \n workTitle = workTitle.addClosure();\n } else{\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().doubleQuote();\n \n }\n } else {\n // work title is blank, try to grab the description\n workTitle = shared.getStringValue(refData.description);\n if (workTitle) {\n workTitle = workTitle.shortenName().addClosure();\n }\n }\n\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let referenceValue = '';\n\n let type = shared.getStringValue(refData.type);\n \n let authorPart = shared.getAuthorPart(refData);\n let publicationPart = getPublicationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n\n if (type == 'archive') {\n let editorString = getInterviewEditorString(refData.contributors);\n\n if (editorString.length == 0) {\n editorString = 'author';\n }\n\n referenceValue = referenceValue.appendData('Interview by ' + editorString);\n referenceValue = referenceValue.addClosure();\n }\n else{\n referenceValue = referenceValue.appendData('Interview by author.');\n }\n \n referenceValue = referenceValue.appendData(publicationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n \n let number = shared.getStringValue(refData.number);\n publicationPart = publicationPart.appendData(number);\n publicationPart = publicationPart.addClosure();\n\n let type = shared.getStringValue(refData.type);\n\n let publisherString;\n if(type === 'personal'){\n publisherString = shared.getPublisherString(refData.publishers, 'reference', false, true);\n } else {\n publisherString = shared.getPublisherStringInverted(refData.publishers, false, true);\n }\n\n if(publisherString !== 'N.p.'){\n publicationPart = publicationPart.appendData(publisherString);\n publicationPart = publicationPart.addClosure();\n }\n \n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n if(publicationDate === ''){\n publicationPart = publicationPart.appendData('N.d.');\n \n } else {\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate);\n publicationPart = publicationPart.addClosure();\n\n }\n\n return publicationPart;\n}\n\n\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle);\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let type = shared.getStringValue(refData.type);\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n if (type == 'archive') {\n let editorString = getInterviewEditorString(refData.contributors);\n\n if (editorString.length == 0) {\n editorString = 'author';\n }\n\n firstInfo = firstInfo.appendData('interview by ' + editorString, ', ');\n }\n else{\n firstInfo = firstInfo.appendData('interview by author', ', ');\n }\n\n if (authorPart.length == 0 && firstInfo.length > 0) {\n firstInfo = firstInfo.upperFirstLetter();\n }\n\n // let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n // firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let number = shared.getStringValue(refData.number);\n number = number.lowerFirstLetter();\n firstInfo = firstInfo.appendData(number, ', ');\n\n let publisherPart = '';\n\n let publisherLocationString;\n if(type === 'personal'){\n publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true, true);\n } else {\n publisherLocationString = shared.getPublisherStringInverted(refData.publishers, true, true);\n }\n\n if(publisherLocationString !== 'n.p.'){\n publisherPart = publisherPart.appendData(publisherLocationString);\n }\n\n let publicationDate = shared.getFullDate(refData.publicationDate);\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n citationLocation = shared.parseTimeStampString(citationLocation);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n let kind = shared.getStringValue(refData.kind);\n\n if (kind != 'anonymous') {\n subsequentInfo = subsequentInfo.appendData('interview', ', ');\n }\n else{\n //if they don't have an author and it's anonymous, throw in something here to avoid empty\n if (subsequentAuthorPart.length == 0) {\n subsequentInfo = subsequentInfo.appendData('interview');\n }\n }\n\n if (subsequentAuthorPart.length == 0 && subsequentInfo.length > 0 ) {\n subsequentInfo = subsequentInfo.upperFirstLetter();\n }\n\n workTitle = shared.getStringValue(refData.workTitle);\n workTitle = workTitle.shortenName().toTitleCase().italicize();\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}\n\nfunction getInterviewEditorString(contributors) {\n\n if (typeof isCitation === 'undefined') {\n isCitation = false;\n }\n\n if (typeof isCitation === 'undefined') {\n isSubsequent = false;\n }\n\n let editorArray = shared.getContributorsByType('editor', contributors);\n let editorString = '';\n\n //1\n if (editorArray.length == 1) {\n editorString = shared.getCitationName(editorArray[0]);\n } \n\n\n //2\n if (editorArray.length == 2) {\n editorString = shared.getCitationName(editorArray[0]) + ' and ' + shared.getCitationName(editorArray[1]);\n } \n \n //3 or more\n if (editorArray.length > 2) {\n\n let contribStringArray = [];\n\n //throw the contrib strings in an array before we build\n let counter = 1;\n _forEach(editorArray, (contrib) => {\n let contribString = '';\n \n contribString = shared.getCitationName(contrib);\n\n contribStringArray.push(contribString);\n counter++;\n });\n\n counter = 1;\n contribStringArray.forEach(contrib => {\n if (counter > 1) {\n\n if (counter == contribStringArray.length) {\n editorString = editorString + ', and '\n }\n else{\n editorString = editorString + ', ';\n }\n }\n\n editorString = editorString + contrib;\n counter++;\n });\n }\n\n return editorString;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let isTrans = isTranslated(refData);\n\n switch (refData.kind) {\n case 'article':\n case 'advance':\n case 'inPress':\n case 'foreign':\n case 'editorial':\n case 'retracted':\n \n //\"Title of the article\" [Translated article title]. Edited by Albert A. Editora. Translated by Albert A. Translatora.\n let articleTitle = shared.getStringValue(refData.articleTitle);\n\n if (articleTitle.startsWith('[')) {\n articleTitle = articleTitle.removeBrackets();\n titlePart = titlePart.appendData(articleTitle);\n }\n else{\n if (!isTrans) {\n articleTitle = articleTitle.replaceAmpersand();\n articleTitle = articleTitle.toTitleCase();\n }\n \n articleTitle = articleTitle.doubleQuote();\n titlePart = titlePart.appendData(articleTitle);\n }\n \n let translatedArticleTitle = shared.getStringValue(refData.translatedArticleTitle);\n\n if (translatedArticleTitle.length > 0 && articleTitle.length == 0) {\n translatedArticleTitle = translatedArticleTitle.doubleQuote();\n }\n else{\n translatedArticleTitle = translatedArticleTitle.bracket();\n }\n\n titlePart = titlePart.appendData(translatedArticleTitle);\n\n break;\n \n case 'section':\n \n let sectionTitle = shared.getStringValue(refData.sectionTitle);\n\n\n if (sectionTitle.startsWith('[')) {\n sectionTitle = shared.removeDescriptionFromTitle(sectionTitle);\n } else{\n if (!isTrans) {\n sectionTitle = sectionTitle.replaceAmpersand();\n sectionTitle = sectionTitle.toTitleCase();\n }\n \n sectionTitle = sectionTitle.doubleQuote(); \n }\n\n titlePart = titlePart.appendData(sectionTitle);\n\n let translatedSectionTitle = shared.getStringValue(refData.translatedSectionTitle);\n translatedSectionTitle = translatedSectionTitle.bracket();\n titlePart = titlePart.appendData(translatedSectionTitle);\n\n break;\n\n case 'issue':\n \n let issueTitle = shared.getStringValue(refData.issueTitle);\n\n\n if (issueTitle.startsWith('[')) {\n issueTitle = shared.removeDescriptionFromTitle(issueTitle);\n } else{\n if (!isTrans) {\n issueTitle = issueTitle.replaceAmpersand();\n issueTitle = issueTitle.toTitleCase();\n }\n \n issueTitle = issueTitle.doubleQuote(); \n }\n\n titlePart = titlePart.appendData(issueTitle);\n\n let translatedIssueTitle = shared.getStringValue(refData.translatedIssueTitle);\n translatedIssueTitle = translatedIssueTitle.bracket();\n titlePart = titlePart.appendData(translatedIssueTitle);\n\n break;\n }\n\n if (refData.kind == 'retracted') {\n titlePart = titlePart.appendData('(retracted)');\n }\n\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n //Journal Title 3, no. 2 (2019): 13–21, 27.\n //journalTitle volume, no. issue (publicationDate.year): referencePages.\n\n if (refData.kind == 'issue') {\n publicationPart = publicationPart.appendData('Special issue,');\n }\n\n if (refData.kind == 'editorial') {\n publicationPart = publicationPart.appendData('Editorial,');\n }\n\n let journalTitle = shared.getStringValue(refData.journalTitle);\n\n if (journalTitle.startsWith('[')) {\n journalTitle = shared.removeDescriptionFromTitle(journalTitle);\n } else{\n journalTitle = journalTitle.replaceAmpersand(); \n journalTitle = journalTitle.italicize(); \n }\n\n publicationPart = publicationPart.appendData(journalTitle);\n\n let volume = shared.getStringValue(refData.volume);\n publicationPart = publicationPart.appendData(volume);\n\n let issue = shared.getStringValue(refData.issue);\n publicationPart = publicationPart.appendData(issue, ', ', 'no.');\n\n let publicationDate = shared.getFullDate(refData.publicationDate);\n\n switch (refData.kind) {\n case 'inPress':\n publicationPart = publicationPart.appendData('(forthcoming)'); \n break;\n \n case 'advance':\n // publicationPart = publicationPart.appendData('Published ahead of print, n.d.'); \n\n if (publicationDate.length > 0) {\n publicationPart = publicationPart.appendData(publicationDate, '. ', 'Published ahead of print,'); \n }\n else{\n publicationPart = publicationPart.appendData('Published ahead of print, n.d.', '. ');\n }\n\n break;\n\n default:\n\n if (publicationDate.length > 0) {\n publicationPart = publicationPart.appendData(publicationDate.parenthesis());\n }\n\n break;\n }\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n\n if (articleNumber.length > 0) {\n publicationPart = publicationPart.appendData(articleNumber, ': ');\n }\n else{\n let referencePages = shared.getStringValue(refData.referencePages);\n referencePages = shared.formatPageNumbers(referencePages, false);\n publicationPart = publicationPart.appendData(referencePages, ': ');\n }\n\n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //https://doi.org/10.123456789\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n let databaseTitle = shared.getStringValue(refData.databaseTitle);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (databaseTitle.length > 0) {\n locationPart = locationPart.appendData(databaseTitle);\n locationPart = locationPart.addClosure();\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n switch (refData.kind) {\n case 'article':\n case 'advance':\n case 'inPress':\n case 'foreign':\n case 'editorial':\n case 'retracted':\n \n citationTitle = shared.getStringValue(refData.articleTitle);\n\n if (citationTitle.startsWith('[')) {\n citationTitle = citationTitle.removeBrackets();\n }\n \n if (citationTitle.length == 0) {\n citationTitle = shared.getStringValue(refData.translatedArticleTitle);\n }\n\n break;\n \n case 'section':\n \n citationTitle = shared.getStringValue(refData.sectionTitle);\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n break;\n\n case 'issue':\n \n citationTitle = shared.getStringValue(refData.issueTitle);\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n break;\n }\n\n citationTitle = citationTitle.replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n //Albert A. Authora et al., \"Title of the article\" [Translated article title], ed. Albert A Editora, trans. Albert A Translatora, Journal Title 3, no. 2 (2019): 4, https://doi.org/10.123456789.\n //Contributors, \"articleTitle\" [translatedArticleTitle]. SecondaryContribs, journalTitle volume, no. issue (publicationDate.year): citationLocation, doi/url.\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let isTrans = isTranslated(refData);\n\n switch (refData.kind) {\n case 'article':\n case 'advance':\n case 'inPress':\n case 'foreign':\n case 'editorial':\n case 'retracted':\n \n //\"Title of the article\" [Translated article title]. Edited by Albert A. Editora. Translated by Albert A. Translatora.\n let articleTitle = shared.getStringValue(refData.articleTitle);\n\n if (articleTitle.startsWith('[')) {\n articleTitle = articleTitle.removeBrackets();\n firstInfo = firstInfo.appendData(articleTitle, ', ');\n }\n else{\n if (!isTrans) {\n articleTitle = articleTitle.replaceAmpersand();\n articleTitle = articleTitle.toTitleCase();\n }\n \n articleTitle = articleTitle.doubleQuote();\n firstInfo = firstInfo.appendData(articleTitle, ', ');\n }\n\n let translatedArticleTitle = shared.getStringValue(refData.translatedArticleTitle);\n\n if (translatedArticleTitle.length > 0 && articleTitle.length == 0) {\n translatedArticleTitle = translatedArticleTitle.doubleQuote();\n firstInfo = firstInfo.appendData(translatedArticleTitle, ', ');\n }\n else{\n translatedArticleTitle = translatedArticleTitle.bracket();\n firstInfo = firstInfo.appendData(translatedArticleTitle);\n }\n\n break;\n \n case 'section':\n \n let sectionTitle = shared.getStringValue(refData.sectionTitle);\n\n if (sectionTitle.startsWith('[')) {\n sectionTitle = shared.removeDescriptionFromTitle(sectionTitle);\n } else{\n if (!isTrans) {\n sectionTitle = sectionTitle.replaceAmpersand();\n sectionTitle = sectionTitle.toTitleCase();\n }\n \n sectionTitle = sectionTitle.doubleQuote(); \n }\n\n firstInfo = firstInfo.appendData(sectionTitle, ', ');\n\n let translatedSectionTitle = shared.getStringValue(refData.translatedSectionTitle);\n translatedSectionTitle = translatedSectionTitle.bracket();\n firstInfo = firstInfo.appendData(translatedSectionTitle);\n\n break;\n\n case 'issue':\n \n let issueTitle = shared.getStringValue(refData.issueTitle);\n\n if (issueTitle.startsWith('[')) {\n issueTitle = shared.removeDescriptionFromTitle(issueTitle);\n } else{\n if (!isTrans) {\n issueTitle = issueTitle.replaceAmpersand();\n issueTitle = issueTitle.toTitleCase();\n }\n \n issueTitle = issueTitle.doubleQuote(); \n }\n\n firstInfo = firstInfo.appendData(issueTitle, ', ');\n\n let translatedIssueTitle = shared.getStringValue(refData.translatedIssueTitle);\n translatedIssueTitle = translatedIssueTitle.bracket();\n firstInfo = firstInfo.appendData(translatedIssueTitle);\n\n break;\n }\n\n if (refData.kind == 'retracted') {\n firstInfo = firstInfo.appendData('(retracted)');\n }\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n if (refData.kind == 'issue') {\n firstInfo = firstInfo.appendData('special issue', ', ');\n }\n\n if (refData.kind == 'editorial') {\n firstInfo = firstInfo.appendData('editorial', ', ');\n }\n\n let journalTitle = shared.getStringValue(refData.journalTitle);\n\n if (journalTitle.startsWith('[')) {\n journalTitle = shared.removeDescriptionFromTitle(journalTitle);\n } else{\n journalTitle = journalTitle.replaceAmpersand(); \n journalTitle = journalTitle.italicize(); \n }\n\n firstInfo = firstInfo.appendData(journalTitle, \", \", '', '', true);\n\n let volume = shared.getStringValue(refData.volume);\n firstInfo = firstInfo.appendData(volume);\n\n let issue = shared.getStringValue(refData.issue);\n firstInfo = firstInfo.appendData(issue, ', ', 'no.');\n\n if (refData.kind == 'inPress') {\n firstInfo = firstInfo.appendData('(forthcoming):');\n }\n else{\n let publicationDate = shared.getFullDate(refData.publicationDate);\n\n if (refData.kind == 'advance') {\n if (publicationDate.length > 0) {\n firstInfo = firstInfo.appendData(publicationDate, ', ', 'published ahead of print,');\n // firstInfo = firstInfo + ',';\n }\n else{\n firstInfo = firstInfo.appendData('published ahead of print, n.d.', ', ');\n // firstInfo = firstInfo + ',';\n }\n }\n else{\n if (publicationDate.length > 0) {\n firstInfo = firstInfo.appendData(publicationDate.parenthesis());\n firstInfo = firstInfo + ':';\n }\n }\n }\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n \n let seperator = ', ';\n\n if (firstInfo.endsWith(':')) {\n seperator = ' ';\n }\n \n firstInfo = firstInfo.appendData(citationLocation, seperator);\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n let databaseTitle = shared.getStringValue(refData.databaseTitle);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (databaseTitle.length > 0) {\n firstInfo = firstInfo.appendData(databaseTitle, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n switch (refData.kind) {\n case 'article':\n case 'advance':\n case 'inPress':\n case 'foreign':\n case 'editorial':\n case 'retracted':\n \n articleTitle = shared.getStringValue(refData.articleTitle);\n\n if (articleTitle.startsWith('[')) {\n articleTitle = articleTitle.removeBrackets().shortenName(isTrans);\n }\n else{\n if (!isTrans) {\n articleTitle = articleTitle.replaceAmpersand();\n articleTitle = articleTitle.toTitleCase();\n }\n \n articleTitle = articleTitle.shortenName(isTrans).doubleQuote();\n }\n \n if (articleTitle.length == 0) {\n translatedArticleTitle = shared.getStringValue(refData.translatedArticleTitle);\n translatedArticleTitle = translatedArticleTitle.shortenName().doubleQuote();\n\n subsequentInfo = subsequentInfo.appendData(translatedArticleTitle, ', ');\n }\n else{\n subsequentInfo = subsequentInfo.appendData(articleTitle, ', ');\n }\n\n break;\n \n case 'section':\n \n sectionTitle = shared.getStringValue(refData.sectionTitle);\n\n if (sectionTitle.startsWith('[')) {\n sectionTitle = shared.removeDescriptionFromTitle(sectionTitle);\n } else{\n if (!isTrans) {\n sectionTitle = sectionTitle.replaceAmpersand();\n sectionTitle = sectionTitle.toTitleCase();\n }\n \n sectionTitle = sectionTitle.shortenName(isTrans).doubleQuote(); \n }\n\n subsequentInfo = subsequentInfo.appendData(sectionTitle, ', ');\n\n break;\n\n case 'issue':\n \n issueTitle = shared.getStringValue(refData.issueTitle);\n\n if (issueTitle.startsWith('[')) {\n issueTitle = shared.removeDescriptionFromTitle(issueTitle);\n } else{\n if (!isTrans) {\n issueTitle = issueTitle.replaceAmpersand();\n issueTitle = issueTitle.toTitleCase();\n }\n \n issueTitle = issueTitle.shortenName(isTrans).doubleQuote(); \n }\n\n subsequentInfo = subsequentInfo.appendData(issueTitle, ', ');\n\n break;\n }\n\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}\n\nfunction isTranslated(refData){\n\n let isTrans = false;\n\n if (refData.kind == 'foreign') {\n return true;\n }\n\n let contributors = shared.removeEmptyContributors(refData.contributors);\n\n let translators = shared.getContributorsByType('translator', contributors);\n let chapterTranslators = shared.getContributorsByType('chapterTranslator', contributors);\n\n if (translators.length > 0 || chapterTranslators.length > 0) {\n isTrans = true;\n }\n\n return isTrans;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nlet useDescriptionForTitle = false; // set as a flag here so i can not include the descritpion later\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.title);\n\n if (workTitle) {\n useDescriptionForTitle = false;\n\n // work title has content\n // if this is a description, remove the brackets\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote();\n }\n } else {\n // work title is blank, try to grab the description\n workTitle = shared.getStringValue(refData.description);\n if (workTitle) {\n useDescriptionForTitle = true;\n workTitle = workTitle.addClosure();\n } else {\n useDescriptionForTitle = false;\n }\n }\n\n\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n if(!useDescriptionForTitle){\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n titlePart = titlePart.appendData(description);\n titlePart = titlePart.addClosure();\n }\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n seriesTitle = seriesTitle.replaceAmpersand().toTitleCase();\n titlePart = titlePart.appendData(seriesTitle);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n let publisherString = shared.getPublisherStringInverted(refData.publishers, false);\n\n if (shared.isSelfPublished(refData)) {\n locationPart = locationPart.appendData('Self-published');\n }\n else{\n locationPart = locationPart.appendData(publisherString);\n }\n\n if (publisherString != 'N.p.') {\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n locationPart = locationPart.appendData(publicationDate, '. ');\n }\n\n locationPart = locationPart.addClosure();\n\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let workTitle = shared.getStringValue(refData.title);\n\n if (workTitle) {\n // work title has content\n // if this is a description, remove the brackets\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote();\n \n }\n } else {\n // work title is blank, try to grab the description\n workTitle = shared.getStringValue(refData.description);\n if (workTitle) {\n workTitle = workTitle.addClosure();\n }\n }\n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n if(!useDescriptionForTitle){\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n description = description.toLowerCase();\n firstInfo = firstInfo.appendData(description, ', ');\n }\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n workTitle = workTitle.replaceAmpersand().toTitleCase();\n firstInfo = firstInfo.appendData(seriesTitle, \", \");\n\n let publisherPart = '';\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n \n if (workTitle.length == 0) {\n //if we dont have a title, use format as the title\n firstInfo = firstInfo.appendData(format, \", \");\n }\n else{\n format = format.toLowerCase();\n publisherPart = publisherPart.appendData(format, ', ');\n }\n\n let publisherLocationString = shared.getPublisherStringInverted(refData.publishers, 'reference', true);\n \n if (shared.isSelfPublished(refData)) {\n publisherPart = publisherPart.appendData('self-pub.');\n }\n else{\n publisherPart = publisherPart.appendData(publisherLocationString, ', ');\n }\n\n if (publisherLocationString != 'n.p.') {\n let publicationDate = shared.getFullDate(refData.publicationDate);\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n }\n\n publisherPart = publisherPart.parenthesis();\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.title);\n\n if (workTitle) {\n // work title has content\n // if this is a description, remove the brackets\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle).shortenName();\n workTitle = workTitle.addClosure();\n } else{\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().doubleQuote();\n \n }\n } else {\n // work title is blank, try to grab the description\n workTitle = shared.getStringValue(refData.format);\n if (workTitle) {\n workTitle = workTitle.shortenName().addClosure();\n }\n }\n \n // console.log('refData.format');\n // console.log(refData.format);\n \n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let kind = shared.getStringValue(refData.kind);\n let type = shared.getStringValue(refData.type);\n\n let workTitle = '';\n let translatedWorkTitle = '';\n\n if(kind === 'section' ){\n workTitle = shared.getStringValue(refData.sectionTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n translatedWorkTitle = shared.getStringValue(refData.translatedSectionTitle);\n } else if(kind === 'issue' ){\n workTitle = shared.getStringValue(refData.issueTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n translatedWorkTitle = shared.getStringValue(refData.translatedIssueTitle); \n } else { // kind === 'article' || kind === 'editorial'\n workTitle = shared.getStringValue(refData.articleTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n translatedWorkTitle = shared.getStringValue(refData.translatedArticleTitle); \n }\n \n if (translatedWorkTitle.length > 0 && workTitle.length == 0) {\n workTitle = translatedWorkTitle;\n translatedWorkTitle = '';\n }\n\n if (workTitle.length > 0) {\n titlePart = workTitle;\n }\n\n if (translatedWorkTitle.length > 0) {\n titlePart = titlePart + ' [' + translatedWorkTitle + ']';\n }\n \n\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n titlePart = titlePart.appendData(description);\n titlePart = titlePart.addClosure();\n\n let magazineTitle = shared.getStringValue(refData.magazineTitle);\n\n if (magazineTitle.startsWith('[')) {\n magazineTitle = shared.removeDescriptionFromTitle(magazineTitle);\n } else{\n magazineTitle = magazineTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n \n if(type === 'special') {\n if(kind === 'section'){\n titlePart = titlePart.appendData('Special section');\n titlePart += ',';\n titlePart = titlePart.appendData(magazineTitle);\n titlePart += ',';\n } else if(kind === 'issue'){\n titlePart = titlePart.appendData('Special issue');\n titlePart += ',';\n titlePart = titlePart.appendData(magazineTitle);\n titlePart += ','; \n }\n } else {\n if(kind === 'editorial'){\n titlePart = titlePart.appendData('Editorial.');\n } else if(kind === 'retracted'){\n titlePart = titlePart.appendData('Retracted article.');\n }\n\n magazineTitle += ',';\n titlePart = titlePart.appendData(magazineTitle);\n }\n \n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n \n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n\n let referencePages = shared.getStringValue(refData.referencePages);\n publicationPart = publicationPart.appendData(referencePages, \", \").addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n \n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.articleTitle).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n \n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let workTitle = '';\n let translatedWorkTitle = '';\n\n if(kind === 'section' ){\n workTitle = shared.getStringValue(refData.sectionTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n translatedWorkTitle = shared.getStringValue(refData.translatedSectionTitle); \n } else if(kind === 'issue' ){\n workTitle = shared.getStringValue(refData.issueTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n translatedWorkTitle = shared.getStringValue(refData.translatedIssueTitle); \n } else { // kind === 'article' || kind === 'editorial'\n workTitle = shared.getStringValue(refData.articleTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n translatedWorkTitle = shared.getStringValue(refData.translatedArticleTitle);\n }\n \n\n if (translatedWorkTitle.length > 0 && workTitle.length == 0) {\n workTitle = translatedWorkTitle;\n translatedWorkTitle = '';\n }\n\n if (translatedWorkTitle.length > 0) {\n workTitle = workTitle + ' [' + translatedWorkTitle + ']';\n }\n\n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n description = description.toLowerCase();\n firstInfo = firstInfo.appendData(description, ', ');\n\n let magazineTitle = shared.getStringValue(refData.magazineTitle);\n\n if (magazineTitle.startsWith('[')) {\n magazineTitle = shared.removeDescriptionFromTitle(magazineTitle);\n } else{\n magazineTitle = magazineTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n if(type === 'special'){\n if(kind === 'section'){\n firstInfo = firstInfo.appendData('special section', ', ');\n } else if(kind === 'issue') {\n firstInfo = firstInfo.appendData('special issue', ', ');\n }\n } else {\n if(kind === 'editorial'){\n firstInfo = firstInfo.appendData('editorial', ', ');\n } else if(kind === 'retracted'){\n firstInfo = firstInfo.appendData('retracted article', ', ');\n }\n }\n\n firstInfo = firstInfo.appendData(magazineTitle, \", \");\n\n let publisherPart = '';\n let publicationDate = shared.getFullDate(refData.publicationDate);\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n if(kind === 'section' ){\n workTitle = shared.getStringValue(refData.sectionTitle);\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle).shortenName();\n } else{\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().doubleQuote(); \n }\n } else if(kind === 'issue' ){\n workTitle = shared.getStringValue(refData.issueTitle);\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle).shortenName();\n } else{\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().italicize(); \n }\n } else { // kind === 'article' || kind === 'editorial'\n workTitle = shared.getStringValue(refData.articleTitle);\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle).shortenName();\n } else{\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().doubleQuote(); \n }\n }\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.workTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n }\n\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n titlePart = titlePart.appendData(description);\n titlePart = titlePart.addClosure();\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n seriesTitle = seriesTitle.replaceAmpersand().toTitleCase();\n titlePart = titlePart.appendData(seriesTitle);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n if (shared.isSelfPublished(refData)) {\n publicationPart = publicationPart.appendData('Self-published');\n }\n else{\n let publisherString = shared.getPublisherString(refData.publishers);\n publicationPart = publicationPart.appendData(publisherString);\n }\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n \n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'workTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let workTitle = shared.getStringValue(refData.workTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n\n if (authorPart.length > 0) {\n workTitle = workTitle.toLowerCase(); \n }\n }\n else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n }\n\n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n description = description.toLowerCase();\n firstInfo = firstInfo.appendData(description, ', ');\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n workTitle = workTitle.replaceAmpersand().toTitleCase();\n firstInfo = firstInfo.appendData(seriesTitle, \", \");\n\n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true);\n let publicationDate = shared.getFullDate(refData.publicationDate);\n let publisherPart = '';\n\n if (shared.isSelfPublished(refData)) {\n publisherPart = publisherPart.appendData('self-pub.');\n }\n else{\n publisherPart = publisherPart.appendData(publisherLocationString);\n }\n\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n\n publisherPart = publisherPart.parenthesis();\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.workTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle).shortenName();\n\n if (subsequentAuthorPart.length > 0) {\n workTitle = workTitle.toLowerCase();\n }\n }\n else{\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().italicize();\n }\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let authorPart = '';\n\n if (kind === 'cover') {\n let groupPerformers = getGroupPerformerString(refData.contributors);\n let performers = getPerformerString(refData.contributors);\n\n if (groupPerformers.length > 0) {\n authorPart = groupPerformers;\n }\n\n if (performers.length > 0) {\n authorPart = performers;\n }\n\n authorPart = authorPart.addClosure();\n }\n else{\n authorPart = shared.getAuthorPart(refData);\n }\n \n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n // let groupPerformerString = shared.getGroupPerformerString(refData.contributors);\n // console.log('groupPerformerString');\n // console.log(groupPerformerString);\n\n if(type === 'album'){\n\t\tlet albumTitle = shared.getStringValue(refData.albumTitle);\n albumTitle = albumTitle.replaceAmpersand();\n albumTitle = albumTitle.toTitleCase().italicize();\n titlePart = titlePart.appendData(albumTitle);\n titlePart = titlePart.addClosure();\n\t} else if(type === 'song'){\n let songTitle = shared.getStringValue(refData.songTitle);\n if (songTitle.startsWith('[')) {\n songTitle = shared.removeDescriptionFromTitle(songTitle);\n } else{\n songTitle = songTitle.replaceAmpersand();\n songTitle = songTitle.toTitleCase().doubleQuote();\n }\n \n titlePart = titlePart.appendData(songTitle);\n titlePart = titlePart.addClosure();\n\t}\n\n let secondaryContributors = '';\n\n if (kind === 'cover') {\n let authorArray = shared.getContributorsByType('author', refData.contributors);\n let authorString = shared.getSecondaryContributorTypeString(authorArray, 'author');\n\n secondaryContributors = authorString.upperFirstLetter();\n }\n else{\n secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n }\n\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let recordDate = shared.getStringValue(refData.recordDate);\n publicationPart = publicationPart.appendData(recordDate, '', 'Recorded');\n publicationPart = publicationPart.addClosure();\n \n let type = shared.getStringValue(refData.type);\n if(type === 'song'){\n let albumTitle = shared.getStringValue(refData.albumTitle);\n if (albumTitle.startsWith('[')) {\n albumTitle = shared.removeDescriptionFromTitle(albumTitle);\n albumTitle = albumTitle.toLowerCase();\n } else{\n albumTitle = albumTitle.replaceAmpersand();\n albumTitle = albumTitle.toTitleCase().italicize();\n }\n \n publicationPart = publicationPart.appendData(albumTitle, ' ', 'On');\n publicationPart = publicationPart.addClosure();\n }\n\n let publisherString = shared.getPublisherString(refData.publishers, 'reference', false, false);\n if (publisherString.length == 0) {\n publisherString = 'N.p.';\n }\n publicationPart = publicationPart.appendData(publisherString);\n\n \n let publicationDate = shared.getStringValue(refData.publicationDate);\n if(publicationDate === ''){\n publicationPart = publicationPart.appendData('n.d.', ', ');\n } else {\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n publicationPart = publicationPart.addClosure();\n }\n \n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n \n //medium\n let medium = shared.getStringValue(refData.medium);\n medium = shared.fixFormatString(medium);\n locationPart = locationPart.appendData(medium).addClosure();\n\n // url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'albumTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n let authorPart = '';\n\n if (kind === 'cover') {\n authorPart = getGroupPerformerString(refData.contributors);\n\n if (authorPart.length == 0) {\n authorPart = getPerformerString(refData.contributors, true);\n }\n }\n else{\n authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n }\n\n firstInfo = firstInfo.appendData(authorPart);\n \n if(type === 'album'){\n\t\tlet albumTitle = shared.getStringValue(refData.albumTitle);\n albumTitle = albumTitle.replaceAmpersand();\n albumTitle = albumTitle.toTitleCase().italicize();\n firstInfo = firstInfo.appendData(albumTitle, ', ');\n\t} else if(type === 'song'){\n let songTitle = shared.getStringValue(refData.songTitle);\n if (songTitle.startsWith('[')) {\n songTitle = shared.removeDescriptionFromTitle(songTitle);\n } else{\n songTitle = songTitle.replaceAmpersand();\n songTitle = songTitle.toTitleCase().doubleQuote();\n }\n\n firstInfo = firstInfo.appendData(songTitle, ', ');\n\t}\n\n if (kind === 'cover') {\n let authorArray = shared.getContributorsByType('author', refData.contributors);\n let authorString = shared.getSecondaryContributorTypeString(authorArray, 'author');\n\n firstInfo = firstInfo.appendData(authorString, \", \");\n }\n\n let recordDate = shared.getStringValue(refData.recordDate);\n firstInfo = firstInfo.appendData(recordDate, ', ', 'recorded');\n \n if(type === 'song'){\n let albumTitle = shared.getStringValue(refData.albumTitle);\n\n if (albumTitle.startsWith('[')) {\n albumTitle = shared.removeDescriptionFromTitle(albumTitle);\n albumTitle = albumTitle.toLowerCase();\n } else{\n albumTitle = albumTitle.replaceAmpersand();\n albumTitle = albumTitle.toTitleCase().italicize();\n }\n \n firstInfo = firstInfo.appendData(albumTitle, ', ', 'on');\n }\n\n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true, false);\n if (publisherLocationString.length == 0) {\n publisherLocationString = 'n.p.';\n }\n\n let publicationDate = shared.getFullDate(refData.publicationDate);\n let publisherPart = '';\n publisherPart = publisherPart.appendData(publisherLocationString);\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n \n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n let format = shared.getStringValue(refData.format);\n format = format.lowerFirstLetter();\n firstInfo = firstInfo.appendData(format, ', ');\n\n let medium = shared.getStringValue(refData.medium);\n firstInfo = firstInfo.appendData(medium, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n citationLocation = shared.parseTimeStampString(citationLocation);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = '';\n\n if (kind === 'cover') {\n subsequentAuthorPart = getGroupPerformerString(refData.contributors);\n\n if (subsequentAuthorPart.length == 0) {\n subsequentAuthorPart = getPerformerString(refData.contributors, true, true);\n }\n }\n else{\n subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n }\n\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n if(type === 'album'){\n\t\tlet albumTitle = shared.getStringValue(refData.albumTitle);\n albumTitle = albumTitle.replaceAmpersand();\n albumTitle = albumTitle.shortenName().toTitleCase().italicize();\n subsequentInfo = subsequentInfo.appendData(albumTitle, ', ');\n\t} else if(type === 'song'){\n let songTitle = shared.getStringValue(refData.songTitle);\n\n if (songTitle.startsWith('[')) {\n songTitle = shared.removeDescriptionFromTitle(songTitle);\n // albumTitle = albumTitle.toLowerCase();\n } else{\n songTitle = songTitle.replaceAmpersand();\n songTitle = songTitle.shortenName().toTitleCase().doubleQuote();\n }\n \n subsequentInfo = subsequentInfo.appendData(songTitle, ', ');\n\t}\n\n \n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}\n\nfunction getGroupPerformerString(contributors){\n let performerString = '';\n let performersArray = [];\n\n contributors = shared.removeEmptyContributors(contributors);\n \n _forEach(contributors, (item) => {\n if (item.type == 'groupPerformer') {\n performersArray.push(item);\n }\n });\n \n //1 Performer\n if (performersArray.length == 1) {\n return performersArray[0].groupName;\n }\n\n //More than 1\n if (performersArray.length > 1) {\n \n var counter = 0;\n performersArray.forEach(item => {\n if (counter > 0) {\n\n if (counter == performersArray.length - 1) {\n performerString = performerString + ', and ';\n }\n else{\n performerString = performerString + ', ';\n }\n }\n\n performerString = performerString + item.groupName;\n \n counter++;\n });\n }\n \n return performerString;\n}\n\nfunction getPerformerString(contributors, isCitation, isSubsequent) {\n\n if (typeof isCitation === 'undefined') {\n isCitation = false;\n }\n\n if (typeof isCitation === 'undefined') {\n isSubsequent = false;\n }\n\n let performerArray = shared.getContributorsByType('performer', contributors);\n let performerString = '';\n\n //1 - Last, First Middle Suffix.\n if (performerArray.length == 1) {\n\n if (isCitation) {\n performerString = shared.getCitationName(performerArray[0], isSubsequent);\n }\n else{\n performerString = shared.getReferenceName(performerArray[0]);\n }\n } \n\n\n //2 - Last, First Middle Suffix., and First Middle Last Suffix.\n if (performerArray.length == 2) {\n if (isCitation) {\n performerString = shared.getCitationName(performerArray[0], isSubsequent) + ' and ' + shared.getCitationName(performerArray[1], isSubsequent);\n }\n else{\n performerString = shared.getReferenceName(performerArray[0]) + ', and ' + shared.getSecondaryReferenceName(performerArray[1]);\n }\n } \n \n //3 or more - Last, First Middle Suffix - list them all\n if (performerArray.length > 2) {\n\n let contribStringArray = [];\n\n //throw the contrib strings in an array before we build\n let counter = 1;\n _forEach(performerArray, (contrib) => {\n let contribString = '';\n \n if (counter == 1) {\n\n if (isCitation) {\n contribString = shared.getCitationName(contrib, isSubsequent);\n }\n else{\n contribString = shared.getReferenceName(contrib);\n }\n }\n else{\n contribString = shared.getSecondaryReferenceName(contrib);\n }\n\n contribStringArray.push(contribString);\n counter++;\n });\n\n counter = 1;\n contribStringArray.forEach(contrib => {\n if (counter > 1) {\n\n if (counter == contribStringArray.length) {\n performerString = performerString + ', and '\n }\n else{\n performerString = performerString + ', ';\n }\n }\n\n performerString = performerString + contrib;\n counter++;\n });\n }\n\n return performerString;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n\n if (publicationPart.length == 0 && locationPart.length == 0) {\n referenceValue = referenceValue.addClosure();\n }\n else{\n referenceValue = referenceValue.appendData(publicationPart, ', ');\n referenceValue = referenceValue.appendData(locationPart);\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n \n let kind = shared.getStringValue(refData.kind);\n\n let workTitle = '';\n let translatedWorkTitle = '';\n\n if(kind === 'section' ){\n workTitle = shared.getStringValue(refData.sectionTitle);\n translatedWorkTitle = shared.getStringValue(refData.translatedSectionTitle); \n \n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n \n } else if(kind === 'issue' ){\n workTitle = shared.getStringValue(refData.issueTitle);\n translatedWorkTitle = shared.getStringValue(refData.translatedIssueTitle); \n \n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n } else { // kind === 'article' || kind === 'editorial'\n workTitle = shared.getStringValue(refData.articleTitle);\n translatedWorkTitle = shared.getStringValue(refData.translatedArticleTitle);\n \n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n }\n \n if (translatedWorkTitle.length > 0 && workTitle.length == 0) {\n workTitle = translatedWorkTitle;\n translatedWorkTitle = '';\n }\n\n if (workTitle.length > 0) {\n titlePart = workTitle;\n }\n\n if (translatedWorkTitle.length > 0) {\n titlePart = titlePart + ' [' + translatedWorkTitle + ']';\n }\n\n if(kind === 'retracted'){\n titlePart = titlePart.appendData('(retracted)');\n }\n\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n titlePart = titlePart.appendData(description);\n titlePart = titlePart.addClosure();\n\n let newspaperTitle = shared.getStringValue(refData.newspaperTitle);\n newspaperTitle = newspaperTitle.replaceAmpersand().toTitleCase().italicize();\n switch(kind){\n case 'editorial':\n titlePart = titlePart.appendData(newspaperTitle);\n titlePart = titlePart.appendData('editorial', ', ');\n break;\n case 'issue':\n titlePart = titlePart.appendData('Special issue');\n titlePart += ',';\n titlePart = titlePart.appendData(newspaperTitle);\n break;\n \n default:\n titlePart = titlePart.appendData(newspaperTitle);\n }\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n \n // 21 Editorial: Minimal - Turabian 9 Reference - there isn't a pubDate but i can't get it to change the comma into a period. \n // could be something from above in get title part where i add a comma if it's an editorial\n if (publicationDate.length > 0) {\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate);\n publicationPart = publicationPart.addClosure();\n }\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = '';\n let doi = shared.getStringValue(refData.doi);\n \n let kind = shared.getStringValue(refData.kind);\n\n if(kind === 'retracted'){\n doi = shared.getStringValue(refData.retractionDOI);\n url = shared.getStringValue(refData.retractionURL);\n \n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n } else {\n if(doi === ''){\n // it's retracted and retractionDOI is still blank so fallback to original doi\n doi = shared.getStringValue(refData.doi); \n doi = shared.appendDOIURL(doi).addClosure();\n locationPart= locationPart.appendData(doi);\n\n } else if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart= locationPart.appendData(doi);\n \n }\n }\n\n } else {\n url = shared.getStringValue(refData.url);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n }\n\n \n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(articleTitle);\n } else{\n citationTitle = citationTitle.replaceAmpersand().toTitleCase(); \n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let kind = shared.getStringValue(refData.kind);\n\n let workTitle = '';\n let translatedWorkTitle = '';\n\n if(kind === 'section' ){\n workTitle = shared.getStringValue(refData.sectionTitle);\n translatedWorkTitle = shared.getStringValue(refData.translatedSectionTitle); \n \n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n } else if(kind === 'issue' ){\n workTitle = shared.getStringValue(refData.issueTitle);\n translatedWorkTitle = shared.getStringValue(refData.translatedIssueTitle); \n \n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n } else { // kind === 'article' || kind === 'editorial'\n workTitle = shared.getStringValue(refData.articleTitle);\n translatedWorkTitle = shared.getStringValue(refData.translatedArticleTitle); \n \n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n }\n \n\n if (translatedWorkTitle.length > 0 && workTitle.length == 0) {\n workTitle = translatedWorkTitle;\n translatedWorkTitle = '';\n }\n\n if (translatedWorkTitle.length > 0) {\n workTitle = workTitle + ' [' + translatedWorkTitle + ']';\n }\n\n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n if(kind === 'retracted'){\n firstInfo = firstInfo.appendData('(retracted)');\n }\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n description = description.toLowerCase();\n firstInfo = firstInfo.appendData(description, ', ');\n\n let newspaperTitle = shared.getStringValue(refData.newspaperTitle);\n newspaperTitle = newspaperTitle.replaceAmpersand().toTitleCase().italicize();\n\n if(kind === 'issue'){\n firstInfo = firstInfo.appendData('special issue', ', ');\n }\n\n firstInfo = firstInfo.appendData(newspaperTitle, \", \");\n \n if(kind === 'editorial'){\n firstInfo = firstInfo.appendData('editorial', ', ');\n }\n\n let publicationDate = shared.getFullDate(refData.publicationDate);\n\n if (publicationDate != 'n.d.') {\n let publisherPart = '';\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n }\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n // doi/url\n let url = '';\n let doi = '';\n \n if(kind === 'retracted'){\n doi = shared.getStringValue(refData.retractionDOI);\n url = shared.getStringValue(refData.retractionURL);\n\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n } else {\n if(doi === ''){\n // it's retracted and retractionDOI is still blank so fallback to original doi\n doi = shared.getStringValue(refData.doi); \n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n\n } else if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n \n }\n \n }\n\n } else {\n doi = shared.getStringValue(refData.doi);\n url = shared.getStringValue(refData.url);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n }\n\n\n \n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n if(kind === 'section' ){\n workTitle = shared.getStringValue(refData.sectionTitle);\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().doubleQuote();\n } else if(kind === 'issue' ){\n workTitle = shared.getStringValue(refData.issueTitle);\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().italicize();\n } else { // kind === 'article' || kind === 'editorial'\n workTitle = shared.getStringValue(refData.articleTitle);\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().doubleQuote();\n }\n \n \n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\nconst _has = require('lodash/has');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n \n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let type = shared.getStringValue(refData.type);\n\n let useTitle = true;\n\n let workTitle = shared.getStringValue(refData.title);\n if(workTitle.length > 0){\n // there is a title, go normal\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n } else {\n // there is no title, check the content\n useTitle = false;\n\n let content = shared.getStringValue(refData.content);\n workTitle = workTitle.appendData(content); \n }\n\n if(type === 'forum'){\n if(useTitle){\n titlePart = titlePart.appendData(workTitle, ' ', 'Reply to');\n } else {\n titlePart = titlePart.appendData(workTitle); \n }\n titlePart = titlePart.addClosure();\n\n let platform = shared.getStringValue(refData.platform);\n titlePart = titlePart.appendData(platform);\n titlePart = titlePart.addClosure();\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n\n if(publicationDate === 'n.d.'){\n titlePart = titlePart.appendData('N.d.');\n } else {\n titlePart = titlePart.appendData(publicationDate);\n }\n \n } else if(type === 'comment'){\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n\n let hasContribs = false;\n\n if (typeof refData.contributors !== 'undefined') {\n if (refData.contributors.length > 0) {\n hasContribs = true;\n }\n }\n \n if(!hasContribs){\n // If no author - put the “Comment on…” before the date.\n if(useTitle){\n titlePart = titlePart.appendData(workTitle, ' ', 'Comment on');\n } else {\n titlePart = titlePart.appendData(workTitle); \n }\n \n titlePart = titlePart.addClosure();\n \n if(publicationDate === 'n.d.'){\n titlePart = titlePart.appendData('N.d.');\n } else {\n titlePart = titlePart.appendData(publicationDate);\n }\n\n } else {\n // there is some contributor, so act normal\n let originalAuthorContribs = shared.getContributorsByType('originalAuthor', refData.contributors);\n if(publicationDate === 'n.d.'){\n titlePart = titlePart.appendData('N.d.');\n } else {\n titlePart = titlePart.appendData(publicationDate);\n }\n titlePart = titlePart.addClosure();\n\n if(originalAuthorContribs[originalAuthorContribs.length - 1] && _has(originalAuthorContribs[originalAuthorContribs.length - 1], 'lastName')){\n titlePart = titlePart.appendData(originalAuthorContribs[originalAuthorContribs.length - 1].lastName, ' ', 'Comment on'); \n titlePart = titlePart.appendData(workTitle, ', ');\n } else {\n titlePart = titlePart.appendData(workTitle, ' ', 'Comment on');\n }\n }\n }\n \n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n // url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let type = shared.getStringValue(refData.type);\n\n let workTitle = shared.getStringValue(refData.title);\n\n let useTitle = true;\n\n if(workTitle.length > 0){\n // there is a title, go normal\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n } else {\n // there is no title, check the content\n useTitle = false;\n\n let content = shared.getStringValue(refData.content);\n workTitle = workTitle.appendData(content); \n }\n\n if(type === 'forum'){\n if(useTitle){\n if(authorPart.length > 0){\n firstInfo = firstInfo.appendData(workTitle, ', ', 'reply to'); \n } else {\n firstInfo = firstInfo.appendData(workTitle, ', ', 'Reply to');\n }\n \n } else {\n firstInfo = firstInfo.appendData(workTitle); \n }\n\n let platform = shared.getStringValue(refData.platform);\n firstInfo = firstInfo.appendData(platform, ', ');\n\n\n let publicationDate = shared.getFullDate(refData.publicationDate);\n firstInfo = firstInfo.appendData(publicationDate, ', ');\n\n } else if(type === 'comment'){\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n\n if(refData.contributors.length === 0){\n // If no author - put the “Comment on…” before the date.\n if(useTitle){\n firstInfo = firstInfo.appendData(workTitle, ', ', 'Comment on'); \n \n } else {\n firstInfo = firstInfo.appendData(workTitle); \n }\n\n firstInfo = firstInfo.appendData(publicationDate, ', ');\n \n } else {\n // there is a contributor so act normal\n let originalAuthorContribs = shared.getContributorsByType('originalAuthor', refData.contributors);\n\n if(originalAuthorContribs[originalAuthorContribs.length - 1] && _has(originalAuthorContribs[originalAuthorContribs.length - 1], 'lastName')){\n \n firstInfo = firstInfo.appendData(publicationDate, ', ');\n\n firstInfo = firstInfo.appendData(originalAuthorContribs[originalAuthorContribs.length - 1].lastName, ', ', 'comment on'); \n firstInfo = firstInfo.appendData(workTitle, ', ');\n\n } else {\n firstInfo = firstInfo.appendData(publicationDate, ', ');\n\n firstInfo = firstInfo.appendData(workTitle, ', ', 'comment on');\n\n \n }\n }\n\n \n\n }\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n let content = '';\n\n if(useTitle){\n workTitle = shared.getStringValue(refData.title);\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().doubleQuote(); \n } else {\n content = shared.getStringValue(refData.content);\n content = content.shortenName();\n // subsequentInfo = subsequentInfo.appendData(content); \n }\n \n\n if(type === 'forum'){\n if(useTitle){\n if(subsequentAuthorPart.length > 0){\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ', 'reply to');\n } else {\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ', 'Reply to');\n }\n } else {\n subsequentInfo = subsequentInfo.appendData(content);\n }\n \n } else if(type === 'comment'){\n if(refData.contributors.length === 0){\n // If no author - put the “Comment on…” before the date.\n if(useTitle){\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ', 'Comment on');\n } else {\n subsequentInfo = subsequentInfo.appendData(content);\n }\n \n \n } else {\n\n let originalAuthorContribs = shared.getContributorsByType('originalAuthor', refData.contributors);\n\n if(originalAuthorContribs[originalAuthorContribs.length - 1] && _has(originalAuthorContribs[originalAuthorContribs.length - 1], 'lastName')){\n subsequentInfo = subsequentInfo.appendData(originalAuthorContribs[originalAuthorContribs.length - 1].lastName, ', ', 'comment on'); \n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n } else {\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ', 'comment on');\n }\n }\n\n }\n\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n title = title.replaceAmpersand().toTitleCase(); \n }\n\n titlePart = titlePart.appendData(title);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n //US Patent [number], filed [fileDate], and issued [publicationDate]. \n publicationPart = publicationPart.appendData(\"US Patent\");\n\n //number\n let number = shared.getStringValue(refData.number);\n publicationPart = publicationPart.appendData(number);\n\n let filedDate = shared.getStringValue(refData.filedDate);\n\n if (filedDate.length > 0) {\n filedDate = shared.getFullDate(filedDate);\n\n publicationPart = publicationPart.appendData(\"filed\", \", \");\n publicationPart = publicationPart.appendData(filedDate);\n }\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n\n if (publicationDate.length > 0) {\n publicationDate = shared.getFullDate(publicationDate); \n\n let seperator = ', ';\n if (filedDate.length > 0) {\n publicationPart = publicationPart.appendData(\"and\", seperator);\n seperator = ' ';\n }\n\n publicationPart = publicationPart.appendData(\"issued\", seperator);\n publicationPart = publicationPart.appendData(publicationDate);\n }\n\n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n \n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n //[contributors], [title], US Patent [number], filed [fileDate], and issued [publicationDate], [location], [url].\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n title = title.replaceAmpersand().toTitleCase(); \n }\n\n firstInfo = firstInfo.appendData(title, \", \");\n\n firstInfo = firstInfo.appendData(\"US Patent\", \", \");\n\n let number = shared.getStringValue(refData.number);\n\n if (number.length > 0) {\n firstInfo = firstInfo.appendData(number);\n }\n\n let filedDate = shared.getStringValue(refData.filedDate);\n\n if (filedDate.length > 0) {\n filedDate = shared.getFullDate(filedDate);\n\n firstInfo = firstInfo.appendData(\"filed\", \", \");\n firstInfo = firstInfo.appendData(filedDate);\n }\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n\n if (publicationDate.length > 0) {\n publicationDate = shared.getFullDate(publicationDate); \n \n let seperator = ', ';\n if (filedDate.length > 0) {\n firstInfo = firstInfo.appendData(\"and\", seperator);\n seperator = ' ';\n }\n\n firstInfo = firstInfo.appendData(\"issued\", seperator);\n firstInfo = firstInfo.appendData(publicationDate);\n }\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let url = shared.getStringValue(refData.url);\n\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n\n //[contributors], [shortenedTitle], [location].\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n }\n\n title = title.replaceAmpersand().shortenName().toTitleCase();\n\n subsequentInfo = subsequentInfo.appendData(title, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: false\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n description = description.replaceAmpersand().toTitleCase();\n titlePart = titlePart.appendData(description);\n titlePart = titlePart.addClosure();\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n seriesTitle = seriesTitle.replaceAmpersand().toTitleCase();\n titlePart = titlePart.appendData(seriesTitle);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n // let publisherString = shared.getPublisherString(refData.publishers);\n // publicationPart = publicationPart.appendData(publisherString);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n \n publicationPart = publicationPart.upperFirstLetter();\n\n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let workTitle = shared.getStringValue(refData.description);\n workTitle = shared.replaceWithAbbreviations(workTitle);\n workTitle = workTitle.lowerFirstLetter();\n if(authorPart === ''){\n workTitle = workTitle.upperFirstLetter();\n }\n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n workTitle = workTitle.replaceAmpersand().toTitleCase();\n firstInfo = firstInfo.appendData(seriesTitle, \", \");\n\n // let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true);\n let publicationDate = shared.getFullDate(refData.publicationDate);\n\n let publisherPart = '';\n // publisherPart = publisherPart.appendData(publisherLocationString);\n if(authorPart === '' && workTitle === ''){\n publicationDate = publicationDate.upperFirstLetter();\n }\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.description);\n\n if(subsequentAuthorPart === '' && workTitle === '' ){\n // test 9 - nothing: no work title or authors so this should only return N.d. (the publication date)\n subsequentInfo = subsequentInfo.appendData(publicationDate, ', ');\n } else {\n workTitle = workTitle.shortenName().lowerFirstLetter();\n if(subsequentAuthorPart === ''){\n workTitle = workTitle.upperFirstLetter();\n }\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n }\n \n \n\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let referenceValue = '';\n \n let authorPart = '';\n \n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n // start by getting the different contibutor types (host | executiveProducer | interview)\n // i need to use them in different ways later based on type and kind\n let hosts = getContriutorByType(refData.contributors, 'host');\n let hostsString = '';\n let executiveProducers = getContriutorByType(refData.contributors, 'executiveProducer');\n let executiveProducersString = '';\n \n let isDescriptionUsedForTitle = false;\n\n let workTitle = shared.getStringValue(refData.title);\n if (workTitle.startsWith('[')) {\n isDescriptionUsedForTitle = true;\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n }\n \n workTitle = workTitle.addClosure();\n\n // do i need to convert Hosts into a 'Hosted by' string\n if(\n type === 'series' ||\n (type === 'episode' && kind === 'radio')\n ){\n if (hosts.length > 0) {\n hostsString = shared.getSecondaryContributorTypeString(hosts, 'host');\n hostsString = hostsString.addClosure();\n } \n }\n\n // do i need to convert Executive Producers into a 'Produced by' string\n if(type !== 'interview'){\n if (executiveProducers.length > 0) {\n executiveProducersString = shared.getSecondaryContributorTypeString(executiveProducers, 'executiveProducer');\n executiveProducersString = executiveProducersString.addClosure();\n \n } \n }\n\n let publisherString = shared.getPublisherString(refData.publishers, 'reference', false, false);\n \n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n \n if(publicationDate !== 'n.d.'){\n publicationDate = publicationDate.addClosure();\n }\n\n let length = shared.parseTimeStampString(refData.length);\n\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n }\n \n switch(type){\n case 'series':\n referenceValue = referenceValue.appendData(workTitle);\n referenceValue = referenceValue.appendData(hostsString);\n referenceValue = referenceValue.appendData(executiveProducersString);\n referenceValue = referenceValue.appendData(publisherString, ' ', 'On');\n\n if(publicationDate !== 'n.d.'){\n if(publisherString === ''){\n referenceValue = referenceValue.appendData(publicationDate);\n } else {\n referenceValue = referenceValue.appendData(publicationDate, ', ');\n }\n }\n\n switch(kind){\n case 'audio':\n referenceValue = referenceValue.appendData('Podcast.');\n break;\n case 'radio':\n referenceValue = referenceValue.appendData('Radio series.');\n break;\n case 'video':\n referenceValue = referenceValue.appendData('Video podcast.');\n break;\n }\n\n referenceValue = referenceValue.appendData(url);\n break;\n\n case 'episode':\n let episodeTitle = shared.getStringValue(refData.episodeTitle);\n if (episodeTitle.startsWith('[')) {\n episodeTitle = shared.removeDescriptionFromTitle(episodeTitle);\n } else{\n episodeTitle = episodeTitle.replaceAmpersand().toTitleCase().doubleQuote();\n }\n episodeTitle = episodeTitle.addClosure();\n\n switch(kind){\n case 'audio':\n authorPart = shared.getAuthorPart(refData);\n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(episodeTitle);\n referenceValue = referenceValue.appendData(executiveProducersString);\n if(publicationDate !== 'n.d.'){\n referenceValue = referenceValue.appendData(publicationDate);\n }\n if(isDescriptionUsedForTitle){\n workTitle = workTitle.toLowerCase();\n }\n referenceValue = referenceValue.appendData(workTitle, ' ', 'In');\n referenceValue = referenceValue.appendData('Podcast');\n referenceValue = referenceValue.appendData(length, ', ');\n break;\n case 'radio':\n referenceValue = referenceValue.appendData(episodeTitle);\n referenceValue = referenceValue.appendData(hostsString);\n referenceValue = referenceValue.appendData(workTitle);\n referenceValue = referenceValue.appendData(publisherString, ' ', 'On');\n referenceValue = referenceValue.addClosure();\n if(publicationDate !== 'n.d.'){\n referenceValue = referenceValue.appendData(publicationDate);\n }\n break;\n case 'video':\n authorPart = shared.getAuthorPart(refData);\n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(episodeTitle);\n referenceValue = referenceValue.appendData(executiveProducersString);\n if(publicationDate !== 'n.d.'){\n referenceValue = referenceValue.appendData(publicationDate);\n }\n referenceValue = referenceValue.appendData(workTitle, ' ', 'In');\n referenceValue = referenceValue.appendData('Video');\n referenceValue = referenceValue.appendData(length, ', ');\n break;\n }\n referenceValue = referenceValue.addClosure();\n referenceValue = referenceValue.appendData(url);\n break;\n case 'interview':\n let workTitleInterview = shared.getStringValue(refData.title);\n\n if (workTitle.startsWith('[')) {\n workTitleInterview = shared.removeDescriptionFromTitle(workTitleInterview);\n } else{\n workTitleInterview = workTitleInterview.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n workTitleInterview = workTitleInterview.addClosure();\n\n //the author part here is the interview contribs\n authorPart = getInterviewerString(refData.contributors);\n authorPart = authorPart.addClosure();\n referenceValue = referenceValue.appendData(authorPart);\n\n referenceValue = referenceValue.appendData(workTitleInterview);\n\n // Interview by [contributor.host].\n let hostString = getHostString(hosts);\n if(hostString){\n referenceValue = referenceValue.appendData(hostString, ' ', 'Interview by');\n referenceValue = referenceValue.addClosure();\n }\n\n referenceValue = referenceValue.appendData(publisherString);\n \n let archiveName = shared.getStringValue(refData.archiveName);\n archiveName = archiveName.italicize();\n archiveName = archiveName.addClosure();\n referenceValue = referenceValue.appendData(archiveName, ', ');\n \n referenceValue = referenceValue.appendData(publicationDate);\n referenceValue = referenceValue.addClosure();\n referenceValue = referenceValue.appendData(url);\n\n break;\n }\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title);\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n } else{\n citationTitle = citationTitle.replaceAmpersand().toTitleCase(); \n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n citationLocation = shared.parseTimeStampString(citationLocation);\n \n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n // start by getting the different contibutor types (host | executiveProducer | interview)\n // i need to use them in different ways later based on type and kind\n let hosts = getContriutorByType(refData.contributors, 'host');\n let hostsString = '';\n let executiveProducers = getContriutorByType(refData.contributors, 'executiveProducer');\n let executiveProducersString = '';\n \n // do i need to convert Hosts into a 'hosted by' string\n if(\n type === 'series' ||\n (type === 'episode' && kind === 'radio')\n ){\n if (hosts.length > 0) {\n hostsString = shared.getSecondaryContributorTypeString(hosts, 'host');\n hostsString = hostsString.lowerFirstLetter();\n } \n }\n\n // do i need to convert Executive Producers into a 'produced by' string\n if(type !== 'interview'){\n if (executiveProducers.length > 0) {\n executiveProducersString = shared.getSecondaryContributorTypeString(executiveProducers, 'executiveProducer');\n executiveProducersString = executiveProducersString.lowerFirstLetter();\n } \n }\n \n let workTitle = shared.getStringValue(refData.title);\n \n let shortWorkTitle;\n \n let isDescriptionUsedForTitle = false;\n\n if (workTitle.startsWith('[')) {\n isDescriptionUsedForTitle = true;\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n shortWorkTitle = workTitle;\n } else{\n shortWorkTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().italicize();\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n }\n\n let publisherString = shared.getPublisherString(refData.publishers, 'reference', false, false);\n \n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n }\n\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n\n switch(type){\n case 'series':\n firstInfo = firstInfo.appendData(workTitle);\n firstInfo = firstInfo.appendData(hostsString, ', ');\n firstInfo = firstInfo.appendData(executiveProducersString, ', ');\n firstInfo = firstInfo.appendData(publisherString, ', ', 'on');\n\n if(publicationDate !== 'n.d.'){\n if(publisherString === ''){\n firstInfo = firstInfo.appendData(publicationDate, ', ');\n } else {\n firstInfo = firstInfo.appendData(publicationDate, ', ');\n }\n }\n switch(kind){\n case 'audio':\n firstInfo = firstInfo.appendData('podcast', ', ');\n break;\n case 'radio':\n firstInfo = firstInfo.appendData('radio series', ', ');\n break;\n case 'video':\n firstInfo = firstInfo.appendData('video podcast', ', ');\n break;\n }\n\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n firstInfo = firstInfo.appendData(url, ', ');\n \n subsequentInfo = subsequentInfo.appendData(shortWorkTitle);\n\n break;\n\n case 'episode':\n let episodeTitle = shared.getStringValue(refData.episodeTitle);\n \n let shortEpisodeTitle;\n shortEpisodeTitle = episodeTitle.replaceAmpersand().shortenName().toTitleCase().doubleQuote();\n\n if (episodeTitle.startsWith('[')) {\n episodeTitle = shared.removeDescriptionFromTitle(episodeTitle);\n } else{\n episodeTitle = episodeTitle.replaceAmpersand().toTitleCase().doubleQuote();\n }\n\n switch(kind){\n case 'audio':\n authorPart = shared.getCitationAuthorPart(refData, 'episodeTitle');\n firstInfo = firstInfo.appendData(authorPart);\n firstInfo = firstInfo.appendData(episodeTitle, ', ');\n firstInfo = firstInfo.appendData(executiveProducersString, ', ');\n if(publicationDate !== 'n.d.'){\n firstInfo = firstInfo.appendData(publicationDate, ', ');\n }\n if(isDescriptionUsedForTitle){\n workTitle = workTitle.toLowerCase();\n }\n firstInfo = firstInfo.appendData(workTitle, ', ', 'in');\n firstInfo = firstInfo.appendData('podcast', ', ');\n \n firstInfo = firstInfo.appendData(url, ', ');\n\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n if(subsequentAuthorPart.length === 0){\n subsequentInfo = subsequentInfo.appendData(episodeTitle);\n }\n\n break;\n case 'radio':\n firstInfo = firstInfo.appendData(episodeTitle);\n firstInfo = firstInfo.appendData(hostsString, ', ');\n firstInfo = firstInfo.appendData(workTitle, ', ');\n firstInfo = firstInfo.appendData(publisherString, ', ', 'on');\n if(publicationDate !== 'n.d.'){\n firstInfo = firstInfo.appendData(publicationDate, ', ');\n }\n firstInfo = firstInfo.appendData(url, ', ');\n\n subsequentInfo = subsequentInfo.appendData(shortEpisodeTitle);\n break;\n case 'video':\n authorPart = shared.getCitationAuthorPart(refData, 'episodeTitle');\n firstInfo = firstInfo.appendData(authorPart);\n firstInfo = firstInfo.appendData(episodeTitle, ', ');\n firstInfo = firstInfo.appendData(executiveProducersString, ', ');\n if(publicationDate !== 'n.d.'){\n firstInfo = firstInfo.appendData(publicationDate, ', ');\n }\n firstInfo = firstInfo.appendData(workTitle, ', ', 'in');\n firstInfo = firstInfo.appendData('video', ', ');\n firstInfo = firstInfo.appendData(url, ', ');\n \n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n break;\n }\n break;\n case 'interview':\n authorPart = getInterviewerString(refData.contributors, true);\n firstInfo = firstInfo.appendData(authorPart);\n\n let workTitleInterview = shared.getStringValue(refData.title);\n\n if (workTitleInterview.startsWith('[')) {\n workTitleInterview = shared.removeDescriptionFromTitle(workTitleInterview);\n } else{\n workTitleInterview = workTitleInterview.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n firstInfo = firstInfo.appendData(workTitleInterview, ', ');\n\n // Interview by [contributor.host].\n let hostString = getHostString(hosts);\n if(hostString){\n firstInfo = firstInfo.appendData(hostString, ', ', 'interview by');\n // firstInfo = firstInfo.addClosure();\n }\n\n firstInfo = firstInfo.appendData(publisherString, ', ');\n \n let archiveName = shared.getStringValue(refData.archiveName);\n archiveName = archiveName.italicize();\n firstInfo = firstInfo.appendData(archiveName, ', ');\n \n firstInfo = firstInfo.appendData(publicationDate, ', ');\n \n firstInfo = firstInfo.appendData(url, ', ');\n\n subsequentAuthorPart = getInterviewerString(refData.contributors, true, true);\n \n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n break;\n }\n\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n\n\n\n\n\n\n // let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n // firstInfo = firstInfo.appendData(authorPart);\n\n // let workTitle = shared.getStringValue(refData.title);\n // workTitle = workTitle.toTitleCase().italicize();\n // firstInfo = firstInfo.appendData(workTitle, \", \");\n\n // let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n // firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n // let description = shared.getStringValue(refData.description);\n // description = shared.replaceWithAbbreviations(description);\n // description = description.toLowerCase();\n // firstInfo = firstInfo.appendData(description, ', ');\n\n // let seriesTitle = shared.getStringValue(refData.seriesTitle);\n // workTitle = workTitle.toTitleCase();\n // firstInfo = firstInfo.appendData(seriesTitle, \", \");\n\n // let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true);\n // let publicationDate = shared.getFullDate(refData.publicationDate);\n // let publisherPart = '';\n\n // if (shared.isSelfPublished(refData)) {\n // publisherPart = publisherPart.appendData('self-pub.');\n // }\n // else{\n // publisherPart = publisherPart.appendData(publisherLocationString);\n // }\n\n // publisherPart = publisherPart.appendData(publicationDate, ', ');\n\n // publisherPart = publisherPart.parenthesis();\n // firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n // let format = shared.getStringValue(refData.format);\n // format = shared.fixFormatStringForCitation(format);\n // firstInfo = firstInfo.appendData(format, ', ');\n\n // let citationLocation = shared.getCitationLocationString(citationData, false);\n // firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n // let articleNumber = shared.getStringValue(refData.articleNumber);\n // firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n // if (firstInfo.endsWith(':')) {\n // firstInfo = firstInfo.removeLastCharacter();\n // }\n\n // let url = shared.getStringValue(refData.url);\n // let doi = shared.getStringValue(refData.doi);\n\n // if (doi.length > 0) {\n // doi = shared.appendDOIURL(doi).addClosure();\n // firstInfo= firstInfo.appendData(doi, ', ');\n // }\n // else{\n // if (url.length > 0) {\n // url = shared.formatURL(url).addClosure();\n // firstInfo = firstInfo.appendData(url, ', ');\n // }\n // }\n\n // //Authora et al., \\\"Title,\\\" 4.\n // //Contributors, \"articleTitle\", citationLocation\n // let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n // subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n // workTitle = shared.getStringValue(refData.title);\n // workTitle = workTitle.shortenName().toTitleCase().italicize();\n\n // subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n // subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}\n\n\n\nfunction getContriutorByType(contributors, typeToGet){\n let returnContributors = [];\n\n _forEach(contributors, (item) => {\n if (item.type == typeToGet) {\n returnContributors.push(item);\n }\n \n });\n\n return returnContributors;\n}\n\nfunction getHostString(hosts){\n let returnHostString = '';\n\n _forEach(hosts, (item) => {\n if(item.firstName !== ''){\n returnHostString += item.firstName + ' ';\n }\n if(item.middleName !== ''){\n returnHostString += item.middleName + '. ';\n }\n if(item.lastName !== ''){\n returnHostString += item.lastName + ' ';\n }\n });//e:forEach\n\n return returnHostString.trim();\n\n}//e:getHostString\n\nfunction getInterviewerString(contributors, isCitation, isSubsequent) {\n\n if (typeof isCitation === 'undefined') {\n isCitation = false;\n }\n\n if (typeof isCitation === 'undefined') {\n isSubsequent = false;\n }\n\n let interviewArray = shared.getContributorsByType('interview', contributors);\n let interviewString = '';\n\n //1 - Last, First Middle Suffix.\n if (interviewArray.length == 1) {\n\n if (isCitation) {\n interviewString = shared.getCitationName(interviewArray[0], isSubsequent);\n }\n else{\n interviewString = shared.getReferenceName(interviewArray[0]);\n }\n } \n\n\n //2 - Last, First Middle Suffix., and First Middle Last Suffix.\n if (interviewArray.length == 2) {\n if (isCitation) {\n interviewString = shared.getCitationName(interviewArray[0], isSubsequent) + ' and ' + shared.getCitationName(interviewArray[1], isSubsequent);\n }\n else{\n interviewString = shared.getReferenceName(interviewArray[0]) + ', and ' + shared.getSecondaryReferenceName(interviewArray[1]);\n }\n } \n \n //3 or more - Last, First Middle Suffix - list them all\n if (interviewArray.length > 2) {\n\n let contribStringArray = [];\n\n //throw the contrib strings in an array before we build\n let counter = 1;\n _forEach(interviewArray, (contrib) => {\n let contribString = '';\n \n if (counter == 1) {\n\n if (isCitation) {\n contribString = shared.getCitationName(contrib, isSubsequent);\n }\n else{\n contribString = shared.getReferenceName(contrib);\n }\n }\n else{\n\n if (isCitation) {\n contribString = shared.getCitationName(contrib, isSubsequent);\n }\n else{\n contribString = shared.getSecondaryReferenceName(contrib);\n }\n }\n\n contribStringArray.push(contribString);\n counter++;\n });\n\n counter = 1;\n contribStringArray.forEach(contrib => {\n if (counter > 1) {\n\n if (counter == contribStringArray.length) {\n interviewString = interviewString + ', and '\n }\n else{\n interviewString = interviewString + ', ';\n }\n }\n\n interviewString = interviewString + contrib;\n counter++;\n });\n }\n\n return interviewString;\n}\n","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.workTitle);\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let isPublisherAndAuthorSame = shared.isPublisherAndAuthorSame(refData);\n\n let publicationPart = '';\n\n let publisherString = shared.getPublisherString(refData.publishers, 'reference', false, false);\n \n if(!isPublisherAndAuthorSame){\n publicationPart = publicationPart.appendData(publisherString);\n }\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n \n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n locationPart = locationPart.appendData('Press release').addClosure();\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n let isPublisherAndAuthorSame = shared.isPublisherAndAuthorSame(refData);\n\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let workTitle = shared.getStringValue(refData.workTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true, false);\n let publicationDate = shared.getFullDate(refData.publicationDate);\n let publisherPart = '';\n \n if(!isPublisherAndAuthorSame){\n publisherPart = publisherPart.appendData(publisherLocationString);\n }\n\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n firstInfo = firstInfo.appendData('press release', ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.workTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle).shortenName();\n } else{\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().doubleQuote(); \n }\n \n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let referenceValue = '';\n\n //for this type, no contributors are primary..editors are always secondary\n let isOnlyEditorsInEntryValue = isOnlyEditorsInEntry(refData);\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n if (!isOnlyEditorsInEntryValue) {\n referenceValue = referenceValue.appendData(authorPart);\n }\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n // any authors (any contributors that are not editors?)\n let isAnyAuthorsValue = isAnyAuthors(refData);\n \n // does this have any contributors?\n if(isAnyAuthorsValue){\n // yes\n let workTitle = shared.getStringValue(refData.entryTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure(); \n } else {\n // no\n\n }\n\n let referenceTitle = shared.getStringValue(refData.referenceTitle);\n if(type === 'entry'){\n if(kind === 'wikipedia'){\n titlePart = titlePart.appendData('Wikipedia');\n }\n\n if (referenceTitle.startsWith('[')) {\n referenceTitle = shared.removeDescriptionFromTitle(referenceTitle);\n } else{\n referenceTitle = referenceTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n if(isAnyAuthorsValue){\n titlePart = titlePart.appendData(referenceTitle, ' ', 'In');\n } else {\n titlePart = titlePart.appendData(referenceTitle);\n }\n \n titlePart = titlePart.addClosure();\n } else if(type === 'whole'){\n if (referenceTitle.startsWith('[')) {\n referenceTitle = shared.removeDescriptionFromTitle(referenceTitle);\n } else{\n referenceTitle = referenceTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n titlePart = titlePart.appendData(referenceTitle);\n titlePart = titlePart.addClosure();\n }\n\n //for this type, no contributors are primary..editors are always secondary\n let isOnlyEditorsInEntryValue = isOnlyEditorsInEntry(refData);\n let secondaryContributors = '';\n\n if (isOnlyEditorsInEntryValue) {\n secondaryContributors = shared.getSecondaryContributorTypeString(refData.contributors, 'editor');\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n }\n else{\n secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n }\n\n let edition = shared.getStringValue(refData.edition);\n\tedition = shared.fixEditionString(edition);\n titlePart = titlePart.appendData(edition);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let publicationPart = '';\n let publisherString = shared.getPublisherString(refData.publishers);\n\n if (shared.isSelfPublished(refData)) {\n publicationPart = publicationPart.appendData('Self-published');\n } else{\n // console.log('publisherString');\n // console.log(publisherString);\n if(publisherString === 'N.p.'){\n if(type === 'entry' && kind === 'wikipedia'){\n // publicationPart = publicationPart.appendData(publisherString);\n } else {\n publicationPart = publicationPart.appendData(publisherString);\n }\n \n } else {\n publicationPart = publicationPart.appendData(publisherString);\n }\n }\n\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n retrievalDate = shared.getFullDate(retrievalDate);\n \n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n \n if(publicationDate === 'n.d.'){\n \n if(retrievalDate === 'n.d.'){\n if(publisherString === 'N.p.'){\n if(type === 'entry' && kind === 'wikipedia'){\n // publicationPart = publicationPart.appendData(publicationDate, ': ');\n } else {\n publicationPart = publicationPart.appendData(publicationDate, ', ');\n }\n } else {\n publicationPart = publicationPart.appendData(publicationDate, ', ');\n }\n } else {\n if (retrievalDate.length > 0) {\n publicationPart = publicationPart.addClosure();\n publicationPart = publicationPart.appendData(retrievalDate, ' ', 'Accessed');\n\n } else{\n publicationPart = publicationPart.appendData(retrievalDate, ', ');\n\n }\n }\n \n } else {\n if(type === 'entry'){\n if(kind === 'wikipedia'){\n publicationPart = publicationPart.appendData(publicationDate, ', ', 'Last modified');\n } else {\n publicationPart = publicationPart.appendData(publicationDate, ', ');\n }\n } else {\n publicationPart = publicationPart.appendData(publicationDate, ', ');\n }\n }\n\n\n \n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.entryTitle);\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n let titleProperty = 'entryTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n //for this type, no contributors are primary..editors are always secondary\n let isOnlyEditorsInEntryValue = isOnlyEditorsInEntry(refData);\n \n // any authors (any contributors that are not editors?)\n let isAnyAuthorsValue = isAnyAuthors(refData);\n \n if(!isOnlyEditorsInEntryValue){\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n }\n \n let workTitle = shared.getStringValue(refData.entryTitle);\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n if(isAnyAuthorsValue){\n firstInfo = firstInfo.appendData(workTitle, ', ');\n }\n\n if(type === 'entry'){\n if(kind === 'wikipedia'){\n firstInfo = firstInfo.appendData('Wikipedia', ', ');\n }\n }\n\n \n let referenceTitle = shared.getStringValue(refData.referenceTitle);\n if(type === 'entry'){\n\n if (referenceTitle.startsWith('[')) {\n referenceTitle = shared.removeDescriptionFromTitle(referenceTitle);\n } else{\n referenceTitle = referenceTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n if(isAnyAuthorsValue){\n firstInfo = firstInfo.appendData(referenceTitle, ', ', 'in');\n } else {\n firstInfo = firstInfo.appendData(referenceTitle, ', ');\n firstInfo = firstInfo.appendData(workTitle, ', ', 's.v.');\n }\n\n } else if(type === 'whole'){\n if (referenceTitle.startsWith('[')) {\n referenceTitle = shared.removeDescriptionFromTitle(referenceTitle);\n } else{\n referenceTitle = referenceTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n firstInfo = firstInfo.appendData(referenceTitle, ', ');\n }\n \n let secondaryContributors = '';\n if (isOnlyEditorsInEntryValue) {\n secondaryContributors = shared.getSecondaryContributorCitationTypeString(refData.contributors, 'editor');\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n }\n else{\n secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n }\n \n let edition = shared.getStringValue(refData.edition);\n\tedition = shared.fixEditionString(edition);\n firstInfo = firstInfo.appendData(edition, ', ');\n \n let publisherPart = '';\n \n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true);\n\n if (shared.isSelfPublished(refData)) {\n publisherPart = publisherPart.appendData('self-pub.');\n } else{\n // if(publisherLocationString !== 'n.p.'){\n publisherPart = publisherPart.appendData(publisherLocationString, ', ');\n // }\n }\n\n let datePart = '';\n\n \n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n \n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n\n if(type === 'entry' && kind === 'wikipedia'){\n if(publicationDate !== 'n.d.'){\n datePart = datePart.appendData(publicationDate, ', ', 'last modified');\n publisherPart = publisherPart.appendData(datePart, ', ');\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n }\n } else {\n datePart = datePart.appendData(publicationDate, ', ');\n if(publicationDate === 'n.d.' && publisherLocationString !== 'n.p.'){\n // if(publicationDate === 'n.d.' && !publisherLocationString.startsWith('n.p.')){\n // publisherPart = publisherPart.appendData(datePart, ': ');\n if (retrievalDate.length == 0) {\n publisherPart = publisherPart.appendData(datePart, ', ');\n }\n } else {\n \n publisherPart = publisherPart.appendData(datePart, ', ');\n }\n\n publisherPart = publisherPart.parenthesis();\n\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n }\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n \n if(publicationDate === 'n.d.'){\n retrievalDate = shared.getFullDate(retrievalDate);\n if(retrievalDate !== 'n.d.'){\n firstInfo = firstInfo.appendData(retrievalDate, ', ', 'accessed');\n }\n }\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n if(!isOnlyEditorsInEntryValue){\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n }\n \n let referenceTitleSubsequent = shared.getStringValue(refData.referenceTitle);\n let workTitleSubsequent = shared.getStringValue(refData.entryTitle);\n\n if(type === 'entry'){\n \n if (referenceTitleSubsequent.startsWith('[')) {\n referenceTitleSubsequent = shared.removeDescriptionFromTitle(referenceTitleSubsequent);\n } else{\n referenceTitleSubsequent = referenceTitleSubsequent.replaceAmpersand().toTitleCase().italicize(); \n }\n\n if (workTitleSubsequent.startsWith('[')) {\n workTitleSubsequent = shared.removeDescriptionFromTitle(workTitleSubsequent);\n } else{\n workTitleSubsequent = workTitleSubsequent.replaceAmpersand().shortenName().toTitleCase().doubleQuote(); \n }\n\n if(isAnyAuthorsValue){\n subsequentInfo = subsequentInfo.appendData(workTitleSubsequent, ', ');\n } else {\n subsequentInfo = subsequentInfo.appendData(referenceTitleSubsequent, ', ');\n subsequentInfo = subsequentInfo.appendData(workTitleSubsequent, ', ', 's.v.');\n }\n \n \n } else if(type === 'whole'){\n if (referenceTitleSubsequent.startsWith('[')) {\n referenceTitleSubsequent = shared.removeDescriptionFromTitle(referenceTitleSubsequent);\n } else{\n referenceTitleSubsequent = referenceTitleSubsequent.replaceAmpersand().toTitleCase().italicize(); \n }\n \n workTitleSubsequent = workTitleSubsequent.appendData(referenceTitleSubsequent, ', ');\n subsequentInfo = subsequentInfo.appendData(workTitleSubsequent, ', ');\n }\n\n \n \n\n \n\n // if(type === 'entry'){\n // referenceTitleSubsequent = referenceTitleSubsequent.toTitleCase().italicize();\n // workTitleSubsequent = workTitleSubsequent.appendData(referenceTitleSubsequent, ', ');\n // if(isAnyAuthorsValue){\n // // firstInfo = firstInfo.appendData(referenceTitle, ', ', 'in');\n // } else {\n // console.log('car')\n // // firstInfo = firstInfo.appendData(referenceTitle, ', ');\n // // firstInfo = firstInfo.appendData(workTitle, ', ', 's.v.');\n // }\n\n // } else if(type === 'whole'){\n \n // referenceTitleSubsequent = referenceTitleSubsequent.toTitleCase().italicize();\n // workTitleSubsequent = workTitleSubsequent.appendData(referenceTitleSubsequent, ', ');\n // }\n \n // console.log('referenceTitle');\n // console.log(referenceTitle);\n\n // subsequentInfo = subsequentInfo.appendData(workTitleSubsequent, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}\n\n\nfunction isOnlyEditorsInEntry(refData){\n let type = shared.getStringValue(refData.type);\n\n let returnValue = false;\n\n if (typeof refData.contributors == 'undefined' || type !== 'entry'){\n return returnValue;\n }\n\n if (refData.contributors.length > 0) {\n \n if (refData.contributors[0].type == 'editor') {\n \n returnValue = true;\n \n\t\t\t_forEach(refData.contributors, (contrib) => {\n if (contrib.type != 'editor') {\n returnValue = true;\n }\n });\n }\n }\n\n return returnValue;\n}//e:isOnlyEditorsInEntry\n\n\nfunction isAnyAuthors(refData){\n let returnValue = false;\n\n let kind = shared.getStringValue(refData.kind);\n \n if (typeof refData.contributors == 'undefined'){\n return returnValue;\n }\n \n // this flag can be ignored if it's wikipedia without contributors is ok\n if (kind === 'wikipedia'){\n return true;\n }\n\n if (refData.contributors.length > 0) {\n _forEach(refData.contributors, (contrib) => {\n if (\n contrib.type === 'author' ||\n contrib.type === 'groupAuthor' ||\n contrib.type === 'username' \n ) {\n returnValue = true;\n }\n });\n }\n\n\n return returnValue;\n}//e:isAnyAuthors\n\nfunction hasEditorsOnly(contributors){\n let editorOnly = false;\n\n if (typeof contributors == 'undefined'){\n return editorOnly;\n }\n\n if (contributors.length > 0) {\n \n if (contributors[0].type == 'editor') {\n \n editorOnly = true;\n \n\t\t\t_forEach(contributors, (contrib) => {\n if (contrib.type != 'editor') {\n editorOnly = true;\n }\n });\n }\n }\n\n return editorOnly;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getAuthorPart(refData){\n let authorPart = '';\n\n if (refData.type == 'regulation') {\n return authorPart;\n }\n else{\n switch (refData.kind) {\n case 'senate':\n authorPart = 'US Congress, Senate.';\n break;\n case 'house':\n authorPart = 'US Congress, House.';\n break;\n }\n }\n\n return authorPart;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n title = title.replaceAmpersand().toTitleCase(); \n }\n\n titlePart = titlePart.appendData(title);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n\n if (refData.type == 'report') {\n //[session] Cong., [sessionPart] sess., [publicationDate].\n let session = shared.getStringValue(refData.session);\n\n if (session.length > 0) {\n session = shared.getOrdinalValue(session);\n }\n\n publicationPart = publicationPart.appendData(session);\n publicationPart = publicationPart.appendData('Cong.');\n\n let sessionPart = shared.getStringValue(refData.sessionPart);\n\n if (sessionPart.length > 0) {\n publicationPart = publicationPart.appendData(sessionPart, ', ');\n publicationPart = publicationPart.appendData('sess.'); \n }\n\n publicationDate = shared.getFullDate(publicationDate); \n \n if(publicationDate === 'n.d.' && publicationPart.length == 0){\n publicationDate = publicationDate.upperFirstLetter();\n }\n\n publicationPart = publicationPart.appendData(publicationDate, ', ');\n publicationPart = publicationPart.addClosure();\n\n switch (refData.kind) {\n case 'senate':\n publicationPart = publicationPart.appendData('S. Rep.');\n break;\n case 'house':\n publicationPart = publicationPart.appendData('H. Rep.');\n break;\n }\n }\n\n if (refData.type == 'regulation') {\n\n if (refData.kind == 'codified') {\n //[volume] C.F.R. § [section]. [publicationDate].\n let volume = shared.getStringValue(refData.volume);\n publicationPart = publicationPart.appendData(volume);\n publicationPart = publicationPart.appendData('C.F.R.');\n\n let section = shared.getStringValue(refData.section);\n section = formatSectionString(section);\n publicationPart = publicationPart.appendData(section, ' ');\n publicationPart = publicationPart.addClosure();\n\n publicationDate = shared.getFullDate(publicationDate); \n\n if(publicationDate === 'n.d.'){\n publicationDate = publicationDate.upperFirstLetter();\n }\n\n publicationPart = publicationPart.appendData(publicationDate);\n publicationPart = publicationPart.addClosure();\n }\n\n if (refData.kind == 'uncodified') {\n //[proposedVolume] F.R. [pageNumber]. Proposed [proposedDate].\n let proposedVolume = shared.getStringValue(refData.proposedVolume);\n publicationPart = publicationPart.appendData(proposedVolume, ', ');\n publicationPart = publicationPart.appendData('F.R.');\n\n let pageNumber = shared.getStringValue(refData.pageNumber);\n publicationPart = publicationPart.appendData(pageNumber);\n publicationPart = publicationPart.addClosure();\n\n let proposedDate = shared.getStringValue(refData.proposedDate);\n\n if (proposedDate.length > 0) {\n proposedDate = shared.getFullDate(proposedDate); \n publicationPart = publicationPart.appendData(proposedDate, ' ', 'Proposed');\n publicationPart = publicationPart.addClosure();\n }\n }\n\n }\n\n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //reportNumber\n let reportNumber = shared.getStringValue(refData.reportNumber);\n locationPart = locationPart.appendData(reportNumber).addClosure();\n\n // url\n let url = shared.getStringValue(refData.url);\n \n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n \n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n //Report\n //[contributor.groupAuthor], [title], [session] Cong., [sessionPart] sess., [publicationDate], S. Rep. [number], [location], [url].\n\n if (refData.type == 'report') {\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n }\n\n let title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n title = title.replaceAmpersand().toTitleCase(); \n }\n\n firstInfo = firstInfo.appendData(title, \", \");\n let publicationDate = shared.getFullDate(refData.publicationDate);\n\n if (refData.type == 'report') {\n\n let session = shared.getStringValue(refData.session);\n\n if (session.length > 0) {\n session = shared.getOrdinalValue(session);\n }\n\n firstInfo = firstInfo.appendData(session, ', ');\n firstInfo = firstInfo.appendData('Cong.');\n\n let sessionPart = shared.getStringValue(refData.sessionPart);\n\n if (sessionPart.length > 0) {\n firstInfo = firstInfo.appendData(sessionPart, ', ');\n firstInfo = firstInfo.appendData('sess.');\n }\n\n firstInfo = firstInfo.appendData(publicationDate, ', ');\n\n switch (refData.kind) {\n case 'senate':\n firstInfo = firstInfo.appendData('S. Rep.', ', ');\n break;\n case 'house':\n firstInfo = firstInfo.appendData('H. Rep.', ', ');\n break;\n }\n\n let reportNumber = shared.getStringValue(refData.reportNumber);\n firstInfo = firstInfo.appendData(reportNumber);\n }\n\n if (refData.type == 'regulation') {\n \n if (refData.kind == 'codified') {\n //[volume] C.F.R. § [section] ([publicationDate])\n let volume = shared.getStringValue(refData.volume);\n firstInfo = firstInfo.appendData(volume, ', ');\n firstInfo = firstInfo.appendData('C.F.R.');\n\n let section = shared.getStringValue(refData.section);\n section = formatSectionString(section);\n firstInfo = firstInfo.appendData(section, ' ');\n\n publicationDate = shared.getFullDate(publicationDate); \n\n if (publicationDate.length > 0) {\n publicationDate = publicationDate.parenthesis();\n firstInfo = firstInfo.appendData(publicationDate, ''); \n }\n }\n\n if (refData.kind == 'uncodified') {\n //[proposedVolume] F.R. [pageNumber], proposed [proposedDate]\n let proposedVolume = shared.getStringValue(refData.proposedVolume);\n firstInfo = firstInfo.appendData(proposedVolume, ', ');\n firstInfo = firstInfo.appendData('F.R.');\n\n let pageNumber = shared.getStringValue(refData.pageNumber);\n firstInfo = firstInfo.appendData(pageNumber);\n\n let proposedDate = shared.getStringValue(refData.proposedDate);\n\n if (proposedDate.length > 0) {\n proposedDate = shared.getFullDate(proposedDate); \n firstInfo = firstInfo.appendData(proposedDate, ', ', 'proposed');\n }\n }\n }\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let url = shared.getStringValue(refData.url);\n\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n\n if (refData.type == 'report') {\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n\n if (subsequentAuthorPart.length > 0) {\n subsequentAuthorPart = subsequentAuthorPart.shortenName();\n }\n\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n }\n\n let shortTitle = shared.getStringValue(refData.shortTitle);\n\n if (shortTitle.length > 0) {\n subsequentInfo = subsequentInfo.appendData(shortTitle.replaceAmpersand().toTitleCase(), ', ');\n }\n else{\n title = shared.getStringValue(refData.title);\n title = title.replaceAmpersand().shortenName().toTitleCase();\n\n subsequentInfo = subsequentInfo.appendData(title, ', ');\n }\n\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}\n\nfunction formatSectionString(section){\n let prefix = '§';\n\n if (section.length == 0) {\n return '';\n }\n\n if (section.includes('-') || section.includes('–') || section.includes('—')) {\n prefix = '§§';\n }\n\n section = prefix + ' ' + section; \n \n return section;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let titlePart = getTitlePart(refData);\n let authorPart = shared.getAuthorPart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(titlePart);\n // referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.bookTitle);\n\n if(workTitle == ''){\n // if bookTitle is blank then use the translated title \n workTitle = shared.getStringValue(refData.translatedTitle);\n }\n\n if (workTitle.length > 0) {\n // if this is a description, remove the brackets and don't italicize\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n \n }\n }\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n\n let allContribs = getSecondaryContributorString(refData.contributors);\n titlePart = titlePart.appendData(allContribs);\n titlePart = titlePart.addClosure();\n\n let version = shared.getStringValue(refData.version);\n version = shared.replaceWithAbbreviations(version);\n titlePart = titlePart.appendData(version);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let publisherString = shared.getPublisherString(refData.publishers, 'reference', false, false); \n\n if (publisherString.length == 0) {\n publisherString = 'N.p.';\n }\n\n publicationPart = publicationPart.appendData(publisherString);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n if(publicationDate === ''){\n // console.log('publicationDate blank');\n publicationPart = publicationPart.appendData('n.d.', ', ');\n } else {\n publicationDate = shared.getFullDate(publicationDate);\n publicationDate = formatOriginalPublicationDate(publicationDate);\n publicationPart = publicationPart.appendData(publicationDate, ', ');\n publicationPart = publicationPart.addClosure();\n }\n\n return publicationPart;\n}\n\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.bookTitle).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n // let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n // let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n // firstInfo = firstInfo.appendData(authorPart);\n\n // let workTitle = shared.getStringValue(refData.bookTitle);\n // workTitle = workTitle.toTitleCase().italicize();\n // firstInfo = firstInfo.appendData(workTitle, \", \");\n\n // let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n // firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n // let seriesTitle = shared.getStringValue(refData.seriesTitle);\n // workTitle = workTitle.toTitleCase();\n // firstInfo = firstInfo.appendData(seriesTitle, \", \");\n\n // let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true);\n // let publicationDate = shared.getFullDate(refData.publicationDate);\n // let publisherPart = '';\n\n // publisherPart = publisherPart.appendData(publisherLocationString);\n\n\n // publisherPart = publisherPart.appendData(publicationDate, ', ');\n\n // publisherPart = publisherPart.parenthesis();\n // firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n // let format = shared.getStringValue(refData.format);\n // format = shared.fixFormatStringForCitation(format);\n // firstInfo = firstInfo.appendData(format, ', ');\n\n // get version now to use later\n let version = shared.getStringValue(refData.version);\n version = shared.replaceWithAbbreviations(version);\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n if(citationLocation === ''){\n if(version === ''){\n // If there isn't citation data or version, then we list the title\n let workTitle = shared.getStringValue(refData.bookTitle);\n if(workTitle == ''){\n // if bookTitle is blank then use the translated title \n workTitle = shared.getStringValue(refData.translatedTitle);\n }\n \n if (workTitle.length > 0) {\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n firstInfo = firstInfo.appendData(workTitle);\n subsequentInfo = subsequentInfo.appendData(workTitle.shortenName(), ', ');\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase();\n firstInfo = firstInfo.appendData(workTitle.italicize());\n subsequentInfo = subsequentInfo.appendData(workTitle.shortenName().italicize(), ', ');\n }\n }\n \n\n } else {\n // use version\n firstInfo = firstInfo.appendData(version);\n firstInfo = firstInfo.addClosure(); \n }\n \n } else {\n citationLocation = citationLocation.upperFirstLetter();\n\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n version= version.parenthesis();\n firstInfo = firstInfo.appendData(version);\n firstInfo = firstInfo.addClosure();\n\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n }\n \n // subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n // subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n \n // let version = shared.getStringValue(refData.version);\n // version = shared.replaceWithAbbreviations(version).parenthesis();\n subsequentInfo = subsequentInfo.appendData(version);\n subsequentInfo = subsequentInfo.addClosure();\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}\n\n//doing this as a one off since this is where all contributors go for this type\nfunction getSecondaryContributorString(contributors){\n let contributorString = '';\n\n if (typeof contributors === 'undefined') {\n return contributorString;\n }\n \n if (contributors.length > 0) {\n // for these contributors, get them all - which is editors and tranlators\n let secondaryContributors = contributors; \n \n if (secondaryContributors.length > 0) {\n let typeStrings = [];\n\n let editors = shared.getContributorsByType('editor', secondaryContributors);\n let translators = shared.getContributorsByType('translator', secondaryContributors);\n \n if (editors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(editors, 'editor'));\n } \n if (translators.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(translators, 'translator'));\n }\n\n typeStrings.forEach((typeString) => {\n if (contributorString.length > 0) {\n contributorString = contributorString + \". \"; // this adds a closure . inbetween the two types of contributors\n }\n\n contributorString = contributorString + typeString;\n });\n\n }//e:if:secondaryContributors.length\n\n }//e:if:contributors.length\n\n return contributorString;\n\n\n}//e:getSecondaryContributorString\n\n\n// this might be Shared later (modified from MLA9-Shared)\nfunction formatOriginalPublicationDate(date) {\n // Also need to remove periods for B.C.E., C.E., A.D., B.C.if used in originalPublicationDate.\n date = date.replace(' B.C.E.', ' BCE');\n date = date.replace(' C.E.', ' CE');\n date = date.replace(' A.D.', ' AD');\n date = date.replace(' B.C.', ' BC');\n\n return date;\n}\n","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authors = shared.getContributorsByType('author', refData.contributors);\n let authorPart = \"\";\n\n if (authors.length > 0) {\n authorPart = shared.getAuthorPart(refData);\n }\n\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let workTitle = shared.getStringValue(refData.reviewedTitle);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase();\n if(kind === 'song' || kind === 'tvEpisode') {\n workTitle = workTitle.doubleQuote();\n } else {\n workTitle = workTitle.replaceAll('\"', '');\n workTitle = workTitle.italicize();\n }\n }\n \n titlePart = titlePart.appendData(workTitle, '', 'Review of');\n \n // let reviewArtists = shared.getContributorsByType('reviewArtist', refData.contributors);\n // let reviewAuthors = shared.getContributorsByType('reviewAuthor', refData.contributors);\n // let reviewComposers = shared.getContributorsByType('reviewComposer', refData.contributors);\n // let reviewDirectors = shared.getContributorsByType('reviewDirector', refData.contributors);\n // let reviewWriters = shared.getContributorsByType('reviewWriter', refData.contributors);\n // let reviewWriterDirectors = shared.getContributorsByType('reviewWriterDirector', refData.contributors);\n \n // let typeStrings = [];\n // if (reviewArtists.length > 0) {\n // typeStrings.push(shared.getSecondaryContributorTypeString(reviewArtists, 'reviewArtist'));\n // }\n // if (reviewAuthors.length > 0) {\n // typeStrings.push(shared.getSecondaryContributorTypeString(reviewAuthors, 'reviewAuthor'));\n // }\n // if (reviewComposers.length > 0) {\n // typeStrings.push(shared.getSecondaryContributorTypeString(reviewComposers, 'reviewComposer'));\n // }\n // if (reviewDirectors.length > 0) {\n // typeStrings.push(shared.getSecondaryContributorTypeString(reviewDirectors, 'reviewDirector'));\n // }\n // if (reviewWriters.length > 0) {\n // typeStrings.push(shared.getSecondaryContributorTypeString(reviewWriters, 'reviewWriter'));\n // }\n // if (reviewWriterDirectors.length > 0) {\n // typeStrings.push(shared.getSecondaryContributorTypeString(reviewWriters, 'reviewWriterDirector'));\n // }\n\n // let contributorString = '';\n // typeStrings.forEach((typeString) => {\n // if (contributorString.length > 0) {\n // contributorString = contributorString + \". \"; // this adds a closure . inbetween the two types of contributors\n // }\n // contributorString = contributorString + typeString;\n // });\n \n let contributorString = getSecondaryContributorString(refData.contributors);\n\n titlePart = titlePart.appendData(contributorString, ', ');\n titlePart = titlePart.addClosure();\n\n switch(type){\n case 'blog':\n let blog = shared.getStringValue(refData.blog);\n\n if (blog.startsWith('[')) {\n blog = shared.removeDescriptionFromTitle(blog);\n } else{\n blog = blog.replaceAmpersand().toTitleCase().italicize();\n }\n \n titlePart = titlePart.appendData(blog, ' ', '', '(blog)');\n titlePart = titlePart.addClosure();\n break;\n\n case 'periodical':\n let periodical = shared.getStringValue(refData.periodical);\n\n if (periodical.startsWith('[')) {\n periodical = shared.removeDescriptionFromTitle(periodical);\n } else{\n periodical = periodical.replaceAmpersand().toTitleCase().italicize();\n }\n\n titlePart = titlePart.appendData(periodical);\n\n let volume = shared.getStringValue(refData.volume);\n titlePart = titlePart.appendData(volume);\n\n let issue = shared.getStringValue(refData.issue);\n titlePart = titlePart.appendData(issue, ', ', 'no.');\n break;\n\n case 'website':\n let website = shared.getStringValue(refData.website);\n\n if (website.startsWith('[')) {\n website = shared.removeDescriptionFromTitle(website);\n }\n\n titlePart = titlePart.appendData(website);\n titlePart = titlePart.addClosure();\n break;\n }\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let type = shared.getStringValue(refData.type);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n\n switch(type){\n case 'periodical':\n publicationDate = shared.getYear(publicationDate); \n \n if (publicationDate.length > 0) {\n publicationDate = publicationDate.parenthesis();\n publicationPart = publicationPart.appendData(publicationDate);\n }\n\n let pageNumbers = shared.getStringValue(refData.pageNumbers);\n pageNumbers = shared.formatPageNumbers(pageNumbers, false);\n publicationPart = publicationPart.appendData(pageNumbers, ': ').addClosure();\n\n break;\n case 'blog':\n case 'website':\n publicationDate = shared.getFullDate(publicationDate); \n\n if(publicationDate === 'n.d.'){\n publicationDate = publicationDate.upperFirstLetter();\n }\n \n publicationPart = publicationPart.appendData(publicationDate);\n publicationPart = publicationPart.addClosure();\n break;\n }\n\n \n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n \n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let authors = shared.getContributorsByType('author', refData.contributors);\n let authorPart = \"\";\n\n if (authors.length > 0) {\n authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n }\n\n firstInfo = firstInfo.appendData(authorPart);\n\n let workTitle = shared.getStringValue(refData.reviewedTitle);\n \n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase();\n\n if(kind === 'song' || kind === 'tvEpisode') {\n workTitle = workTitle.doubleQuote();\n } else {\n workTitle = workTitle.replaceAll('\"', '');\n workTitle = workTitle.italicize();\n }\n }\n\n firstInfo = firstInfo.appendData(workTitle, ', ', 'review of');\n\n if (authorPart.length == 0) {\n firstInfo = firstInfo.upperFirstLetter();\n }\n\n let contributorString = getSecondaryContributorString(refData.contributors);\n firstInfo = firstInfo.appendData(contributorString, ', ');\n\n switch(type){\n case 'blog':\n let blog = shared.getStringValue(refData.blog);\n\n if (blog.startsWith('[')) {\n blog = shared.removeDescriptionFromTitle(blog);\n } else{\n blog = blog.replaceAmpersand().toTitleCase().italicize();\n } \n\n firstInfo = firstInfo.appendData(blog, ', ', '', '(blog)');\n break;\n\n case 'periodical':\n let periodical = shared.getStringValue(refData.periodical);\n\n if (periodical.startsWith('[')) {\n periodical = shared.removeDescriptionFromTitle(blog);\n } else{\n periodical = periodical.replaceAmpersand().toTitleCase().italicize();\n } \n \n firstInfo = firstInfo.appendData(periodical, ', ');\n\n let volume = shared.getStringValue(refData.volume);\n firstInfo = firstInfo.appendData(volume);\n\n let issue = shared.getStringValue(refData.issue);\n firstInfo = firstInfo.appendData(issue, ', ', 'no.');\n break;\n\n case 'website':\n let website = shared.getStringValue(refData.website);\n\n if (website.startsWith('[')) {\n website = shared.removeDescriptionFromTitle(website);\n }\n\n firstInfo = firstInfo.appendData(website, ', ');\n break;\n }\n \n let publicationDate = shared.getStringValue(refData.publicationDate);\n \n switch(type){\n case 'periodical':\n publicationDate = shared.getYear(publicationDate); \n publicationDate = publicationDate.parenthesis();\n firstInfo = firstInfo.appendData(publicationDate);\n\n let pageNumbers = shared.getStringValue(refData.pageNumbers);\n pageNumbers = shared.formatPageNumbers(pageNumbers, false);\n firstInfo = firstInfo.appendData(pageNumbers, ': ')\n\n break;\n case 'blog':\n case 'website':\n publicationDate = shared.getFullDate(publicationDate); \n firstInfo = firstInfo.appendData(publicationDate, ', ');\n break;\n }\n\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n } else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n let subsequentAuthorPart = \"\";\n if (authors.length > 0) {\n subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n }\n\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n let subsequetWorkTitle = shared.getStringValue(refData.reviewedTitle);\n\n if (subsequetWorkTitle.startsWith('[')) {\n subsequetWorkTitle = shared.removeDescriptionFromTitle(subsequetWorkTitle).shortenName();\n } else{\n subsequetWorkTitle = subsequetWorkTitle.replaceAmpersand().shortenName().toTitleCase();\n }\n\n\n if (subsequetWorkTitle.startsWith('\"')) {\n subsequetWorkTitle = subsequetWorkTitle.substring(1);\n } \n if (subsequetWorkTitle.endsWith('\"')) {\n subsequetWorkTitle = subsequetWorkTitle.slice(0, -1);\n } \n // console.log('subsequetWorkTitle');\n // console.log(subsequetWorkTitle);\n\n if (!subsequetWorkTitle.endsWith('\"')) {\n if(kind === 'song' || kind === 'tvEpisode'){\n subsequetWorkTitle = subsequetWorkTitle.doubleQuote();\n } else {\n subsequetWorkTitle = subsequetWorkTitle.italicize();\n }\n }\n\n\n subsequentInfo = subsequentInfo.appendData(subsequetWorkTitle, ', ', 'review of');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n if (authors.length == 0) {\n subsequentInfo = subsequentInfo.upperFirstLetter();\n }\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}\n\n//doing this as a one off since this is where all contributors go for this type\nfunction getSecondaryContributorString(contributors){\n\n let contributorstring = '';\n\n if (typeof contributors === 'undefined') {\n return contributorstring;\n }\n\n if (contributors.length > 0) {\n //for these contributors, get them all - which is editors and tranlators\n let secondaryContributors = contributors; \n \n if (secondaryContributors.length > 0) {\n\n let typeStrings = [];\n\n let reviewAuthors = shared.getContributorsByType('reviewAuthor', secondaryContributors);\n let reviewEditors = shared.getContributorsByType('reviewEditor', secondaryContributors);\n let directors = shared.getContributorsByType('reviewDirector', contributors);\n let writers = shared.getContributorsByType('reviewWriter', contributors);\n let writerDirectors = shared.getContributorsByType('reviewWriterDirector', contributors);\n let artists = shared.getContributorsByType('reviewArtist', contributors);\n let reviewComposers = shared.getContributorsByType('reviewComposer', contributors);\n let reviewGroupArtists = shared.getContributorsByType('reviewGroupArtist', contributors);\n\n if (writerDirectors.length > 0) {\n if (directors.length > 0 || writers.length > 0) {\n \n //we need to get order they were entered correctly, so let's recreate these arrays as listed\n directors = [];\n writers = [];\n writerDirectors = [];\n\n\t\t\t\t\t_forEach(contributors, (contributor) => {\n switch (contributor.type) {\n case 'reviewDirector':\n directors.push(contributor);\n break;\n case 'reviewWriter':\n writers.push(contributor);\n break;\n case 'reviewWriterDirector':\n directors.push(contributor);\n writers.push(contributor);\n break;\n }\n });\n }\n }\n\n if (reviewAuthors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(reviewAuthors, 'reviewAuthor'));\n }\n\n if (reviewEditors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(reviewEditors, 'editor'));\n }\n\n //directors\n if (directors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(directors, 'director'));\n }\n\n //writers\n if (writers.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(writers, 'writer'));\n }\n\n //writerDirectors\n if (writerDirectors.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(writerDirectors, 'writerDirector'));\n }\n\n //artists\n if (artists.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(artists, 'reviewArtist'));\n }\n\n //reviewGroupArtists\n if (reviewGroupArtists.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(reviewGroupArtists, 'reviewGroupArtist'));\n }\n\n //reviewComposers\n if (reviewComposers.length > 0) {\n typeStrings.push(shared.getSecondaryContributorTypeString(reviewComposers, 'reviewComposer'));\n }\n\n typeStrings.forEach(typeString => {\n if (contributorstring.length > 0) {\n contributorstring = contributorstring + \", \"\n }\n\n contributorstring = contributorstring + typeString.lowerFirstLetter();\n });\n }\n\n }\n\n return contributorstring;\n}","const _forEach = require('lodash/forEach');\nconst _has = require('lodash/has');\nconst dateHelper = require('../dateHelper');\n\nmodule.exports = {\n getOrderByValue,\n getAuthorPart,\n getAuthorPartSort,\n getStringValue,\n getContributorsByType,\n getSecondaryContributorString,\n getSecondaryContributorCitationString,\n getFullDate,\n getYear,\n formatURL,\n appendDOIURL,\n getCitationAuthorPart,\n getCitations,\n getFullDateRange,\n getGroupAuthorCitationString,\n getPublisherString,\n getPublisherStringInverted,\n fixFormatString,\n fixFormatStringForCitation,\n fixEditionString,\n formatPageNumbers,\n getPrimaryContributorType,\n getChapterTranslators,\n getChapterTranslatorString,\n getCitationVolume,\n removeEmptyContributors,\n getSecondaryReferenceName,\n getCitationLocationString,\n fixPageDash,\n replaceWithAbbreviations,\n isSelfPublished,\n removeDescriptionFromTitle,\n parseTimeStampString,\n isPublisherAndAuthorSame,\n getSecondaryContributorTypeString,\n getSecondaryContributorCitationTypeString,\n getReferenceName,\n getCitationName,\n getOrdinalValue\n}\n\nfunction getOrderByValue(reference){\n\n let referenceValue = reference.displayValue;\n\n if (referenceValue == '') {\n return '';\n }\n\n let orderByValue = referenceValue;\n\n orderByValue = orderByValue.replace(reference.authorPart, reference.authorPartSort);\n\n //check to see if the author part includes contributor labels, if they do, remove them\n // if (reference.authorPart != reference.authorPartNoLabel) {\n // orderByValue = orderByValue.replace(reference.authorPart, reference.authorPartNoLabel);\n // }\n \n //before we remove any tags, replace anything within italics and is a number with text\n //22 searches for Sasquatch\n //twenty two searches for Sasquatch\n\n var words = orderByValue.split(\" \");\n let inItalics = false;\n for (var i = 0; i < words.length; i += 1) {\n if (words[i].startsWith('')) {\n inItalics = true;\n words[i] = words[i].replace('', '');\n }\n\n if (inItalics) {\n words[i] = words[i].replace(':', '');\n words[i] = convertNumberToText(words[i]);\n }\n\n if (words[i].endsWith('')) {\n inItalics = false;\n words[i] = words[i].replace('', '');\n }\n }\n\n orderByValue = words.join(' ');\n\n //now split back out and remove anything in brackets (like user names)\n words = orderByValue.split(\" \");\n let bracketlessArray = [];\n let inBrackets = false;\n\n for (var i = 0; i < words.length; i += 1) {\n\n if (i > 0) {\n if (words[i].startsWith('[')) {\n inBrackets = true;\n } \n }\n \n if (inBrackets === false) {\n bracketlessArray.push(words[i]);\n }\n\n if (i > 0) {\n if (words[i].endsWith(']') || words[i].endsWith('].')) {\n inBrackets = false;\n }\n }\n }\n\n orderByValue = bracketlessArray.join(' ');\n\n orderByValue = removeTags(orderByValue);\n\n //we need to parse the date from the value and convert it to sortable\n //IE: 2020, March 15 to 2020 03 15\n var array = orderByValue.split(\".\");\n\n for (i = 0; i < array.length; i++) {\n\n if (array[i].startsWith(' (') && array[i].endsWith(')')) {\n array[i] = array[i].split(\"(\").join(\"\");\n array[i] = array[i].split(\")\").join(\"\");\n\n //if the array is just a year, then append 00 00\n if (array[i].length == 5) {\n if (isInteger(array[i])) {\n array[i] = array[i] + ' 00 00';\n }\n }\n\n //if this section has a month only, we need to add a 00 for the sort after ut\n if (array[i].endsWith('January') || array[i].endsWith('February') || array[i].endsWith('March') ||\n array[i].endsWith('April') || array[i].endsWith('May') || array[i].endsWith('June') || \n array[i].endsWith('July') || array[i].endsWith('August') || array[i].endsWith('September') || \n array[i].endsWith('October') || array[i].endsWith('November') || array[i].endsWith('December')) {\n array[i] = array[i] + ' 00';\n }\n\n //replace any months with digits for sorting\n array[i] = array[i].replace('January', '01');\n array[i] = array[i].replace('February', '02');\n array[i] = array[i].replace('March', '03');\n array[i] = array[i].replace('April', '04');\n array[i] = array[i].replace('May', '05');\n array[i] = array[i].replace('June', '06');\n array[i] = array[i].replace('July', '07');\n array[i] = array[i].replace('August', '08');\n array[i] = array[i].replace('September', '09');\n array[i] = array[i].replace('October', '10');\n array[i] = array[i].replace('November', '11');\n array[i] = array[i].replace('December', '12');\n }\n\n }\n\n orderByValue = array.join('.');\n orderByValue = orderByValue.split(\". \").join(\" \");\n\n if (orderByValue.endsWith('.')) {\n orderByValue = orderByValue.substring(0, orderByValue.length - 1);\n }\n\n orderByValue = orderByValue.split(\"(enacted)\").join(\"\");\n orderByValue = orderByValue.split(\"(Reprinted from\").join(\"\");\n orderByValue = orderByValue.split(\"(Director)\").join(\"\");\n orderByValue = orderByValue.split(\"(Original work published \").join(\"\");\n orderByValue = orderByValue.split(\"(Retraction published \").join(\"\");\n orderByValue = orderByValue.split(\"(Host)\").join(\"\");\n orderByValue = orderByValue.split(\"(Hosts)\").join(\"\");\n orderByValue = orderByValue.split(\"(Executive Producer)\").join(\"\");\n orderByValue = orderByValue.split(\"(Executive Producers)\").join(\"\");\n orderByValue = orderByValue.split(\"(Ed.)\").join(\"\");\n orderByValue = orderByValue.split(\"(Eds.)\").join(\"\");\n orderByValue = orderByValue.split(\"Ed. & Trans.\").join(\"\");\n orderByValue = orderByValue.split(\", Trans.\").join(\" \");\n\n orderByValue = orderByValue.split(\".,\").join(\"\");\n orderByValue = orderByValue.split(\",\").join(\"\");\n orderByValue = orderByValue.split(\"[\").join(\"\");\n orderByValue = orderByValue.split(\"]\").join(\"\");\n orderByValue = orderByValue.split(\"(\").join(\" \");\n orderByValue = orderByValue.split(\")\").join(\" \");\n orderByValue = orderByValue.split(String.fromCharCode(34)).join(\"\"); //double quotes\n orderByValue = orderByValue.split(\"“\").join(\"\");\n orderByValue = orderByValue.split(\"”\").join(\"\");\n orderByValue = orderByValue.split(\"”\").join(\"\");\n orderByValue = orderByValue.split(\": \").join(\" \");\n orderByValue = orderByValue.split(\" n.d. \").join(\" 0000 \");\n orderByValue = orderByValue.split(\" n.d.-\").join(\" 0000\");\n orderByValue = orderByValue.split(\" in press \").join(\" 9999 \");\n orderByValue = orderByValue.split(\" in press-\").join(\" 9999\");\n orderByValue = orderByValue.split(\" \").join(\" \");\n orderByValue = orderByValue.split(\". & \").join(\" \");\n orderByValue = orderByValue.split(\" & \").join(\" \");\n\n //replace special characters with their equivalent values\n orderByValue = orderByValue.split(\"é\").join(\"e\");\n orderByValue = orderByValue.split(\"á\").join(\"a\");\n orderByValue = orderByValue.split(\"ú\").join(\"u\");\n orderByValue = orderByValue.split(\"í\").join(\"i\");\n orderByValue = orderByValue.split(\"ó\").join(\"o\");\n orderByValue = orderByValue.split(\"ñ\").join(\"n\");\n orderByValue = orderByValue.split(\"ü\").join(\"u\");\n orderByValue = orderByValue.split(\"ö\").join(\"o\");\n orderByValue = orderByValue.split(\"ä\").join(\"a\");\n orderByValue = orderByValue.split(\"ç\").join(\"c\");\n \n orderByValue = orderByValue.toLowerCase();\n orderByValue = orderByValue.trim();\n\n\treturn orderByValue;\n}\n\nfunction getStringValue(input){\n var output = '';\n\n //helper to check for mull values\n if (typeof input !== 'undefined'){\n output = input.trim();\n }\n \n return output;\n}\n\nfunction getFullDate(date){\n\n if (typeof date == 'undefined'){\n return '';\n }\n\n if (date.length == 0) {\n date = 'n.d.';\n } else {\n if (date.includes(\"/\")) {\n var array = date.split(\"/\");\n\n let month = '';\n let day = '';\n let year = '';\n\n switch (array.length) {\n case 3:\n if (array[0].length > 0) {\n month = dateHelper.format(array[0] + '/1/2020', 'mmmm');\n }\n\n if (array[1].length > 0) {\n day = dateHelper.format('1/' + array[1] + '/2020', 'd');\n }\n\n if (array[2].length > 0) {\n year = dateHelper.format('1/1/' + array[2], 'yyyy');\n }\n\n break;\n case 2:\n\n //this is for the format of 2021/2022\n if (array[0].length == 4 && array[1].length == 4) {\n // return array[0] + '–' + array[1];\n return getYear(date);\n }\n\n //for the format of May/June 2019\n if (array[1].includes(\" \")) {\n return date;\n } \n\n if (array[0].length > 0) {\n month = dateHelper.format(array[0] + '/1/2020', 'mmmm');\n }\n \n if (array[1].length > 0) {\n year = dateHelper.format('1/1/' + array[1], 'yyyy');\n }\n\n break;\n case 1: \n if (array[0].length > 0) {\n year = dateHelper.format('1/1/' + array[0], 'yyyy');\n }\n\n break;\n }\n\n\n if (year.length > 0) {\n date = year;\n\n if (month.length > 0 && day.length > 0) {\n date = month + ' ' + day + ', ' + year;\n }\n else{\n if (month.length > 0) {\n date = month + ' ' + year;\n }\n }\n }\n else{\n if (month.length > 0) {\n date = month;\n\n if (day.length > 0) {\n date = month + ' ' + day;\n }\n }\n }\n \n } else {\n date = date;\n\n // if (date.includes('–') && !date.includes('present')) {\n // //assume this is a year, so get its format\n // date = getYear(date);\n // }\n\n }\n }\n\n if (date == '//') {\n date = 'n.d.';\n }\n\n return date;\n}\n\nfunction getYear(date){\n var year = '';\n\n if (typeof date == 'undefined'){\n return '';\n }\n\n date = fixPageDash(date);\n\n //2018-2020 need to be abbrivated as 2018-20\n if (date.includes('–')) {\n var array = date.split(\"–\");\n\n if (array.length == 2) {\n\n //trim both entries\n array[0] = array[0].trim();\n array[1] = array[1].trim();\n\n //both 4 chars\n if (array[0].length == 4 && array[1].length == 4) {\n if (array[0].substring(0, 2) == array[1].substring(0, 2)) {\n year = array[0] + '-' + array[1].substring(2);\n return fixPageDash(year);\n }\n }\n }\n }\n\n //see if the format is either 2019 or 2/2/2019 or 2018/2020\n if (date.includes(\"/\")) {\n //split into an array and grab the last entry in that array\n var array = date.split(\"/\");\n\n if (array.length == 2) {\n //both 4 chars\n if (array[0].length == 4 && array[1].length == 4) {\n if (array[0].substring(0, 2) == array[1].substring(0, 2)) {\n year = array[0] + '-' + array[1].substring(2);\n return fixPageDash(year);\n }\n }\n }\n\n year = array[array.length-1]\n }\n else{\n if (date.length > 4) {\n\n //2018-2020\n if (date.includes(\"-\")) {\n year = date;\n }\n else {\n try {\n year = dateHelper.format(date, \"yyyy\");\n }\n catch(err) {\n console.log('Failed to convert year of ' + date);\n console.log(err);\n year = date;\n }\n }\n }\n else {\n //assume this is only a year\n year = date;\n }\n }\n\n if (year == '') {\n year = 'n.d.';\n }\n\n return year;\n}\n\nfunction formatURL(url){\n let formatURL = '';\n\n if (url.length > 0) {\n formatURL = '' + url + '';\n }\n\n return formatURL;\n}\n\nfunction appendDOIURL(doi){\n let url = '';\n\n if (doi.length > 0) {\n if (!doi.startsWith('https://doi.org/') && !doi.startsWith('http://doi.org/') ) {\n\n //in case they enter a URL in the DOI\n if ((doi.startsWith('https:') || doi.startsWith('http:'))) {\n\n if (doi.startsWith('https://dx.doi.org/') || doi.startsWith('http://dx.doi.org/')) {\n doi = doi.replace('https://dx.doi.org/', '');\n doi = doi.replace('http://dx.doi.org/', '');\n\n url = 'https://doi.org/' + doi;\n }else{\n return formatURL(doi);\n }\n }\n else{\n //if they happen to start this with dx.doi.org, pull that out\n \n doi = doi.replace('dx.doi.org/', '');\n doi = doi.replace('doi.org/', '');\n\n url = 'https://doi.org/' + doi;\n }\n }\n else{\n url = doi;\n }\n\n url = formatURL(url);\n }\n\n return url;\n}\n\nfunction fixPageDash(pages){\n \n let cleanPages = ''\n\n cleanPages = pages.replace('-', '–');\n cleanPages = cleanPages.replace(' - ', '–');\n cleanPages = cleanPages.replace(' – ', '–');\n\n return cleanPages;\n}\n\nfunction getAuthorPart(refData, groupAuthorsAsAuthors, excludeRole){\n let contributorstring = '';\n\n if (typeof refData.contributors === 'undefined') {\n return contributorstring;\n }\n\n if (typeof groupAuthorsAsAuthors === 'undefined') {\n groupAuthorsAsAuthors = true;\n }\n\n if (typeof excludeRole === 'undefined') {\n excludeRole = false;\n }\n\n let contributors = refData.contributors;\n\n contributors = removeEmptyContributors(contributors);\n\n if (contributors.length > 0) {\n\n let primaryType = getPrimaryContributorType(refData);\n\n // //if the primary type is not an author, verify that we don't have any authors\n // if (primaryType !== 'author' && primaryType !== 'groupAuthor') {\n // let authorContribs = getContributorsByType('author', contributors);\n\n // //we have authors, they just arent added first, make them primary anyways\n // if (authorContribs.length > 0) {\n // primaryType = 'author';\n // }\n // }\n\n let pluralLabel = false;\n let primaryContributors = getContributorsByType(primaryType, contributors);\n\n let index = 0;\n\n if (!groupAuthorsAsAuthors) {\n if (primaryType == 'author') {\n _forEach(primaryContributors, (contrib) => {\n if (typeof contrib !== 'undefined') {\n if (contrib.type == 'groupAuthor') {\n primaryContributors.splice(index, 1);\n }\n }\n \n index++;\n });\n }\n }\n\n //1 - Last, First Middle Suffix.\n if (primaryContributors.length == 1) {\n contributorstring = getReferenceName(primaryContributors[0]);\n\n // if (primaryType == ) {\n \n // }\n } \n\n\n //2 - Last, First Middle Suffix., and First Middle Last Suffix.\n if (primaryContributors.length == 2) {\n\n //if the first entry is a group author a comma is not needed, otherwise it is\n if (primaryType == 'groupAuthor') {\n contributorstring = getReferenceName(primaryContributors[0]) + ' and ' + getSecondaryReferenceName(primaryContributors[1]);\n }\n else{\n contributorstring = getReferenceName(primaryContributors[0]) + ', and ' + getSecondaryReferenceName(primaryContributors[1]);\n }\n\n pluralLabel = true;\n } \n \n //3 or more - Last, First Middle Suffix - list them all\n if (primaryContributors.length > 2) {\n\n let contribStringArray = [];\n\n //throw the contrib strings in an array before we build\n let counter = 1;\n _forEach(primaryContributors, (contrib) => {\n let contribString = '';\n \n if (counter == 1) {\n contribString = getReferenceName(contrib);\n }\n else{\n contribString = getSecondaryReferenceName(contrib);\n }\n\n contribStringArray.push(contribString);\n counter++;\n });\n\n counter = 1;\n contribStringArray.forEach(contrib => {\n if (counter > 1) {\n\n if (counter == contribStringArray.length) {\n contributorstring = contributorstring + ', and '\n }\n else{\n contributorstring = contributorstring + ', ';\n }\n }\n\n contributorstring = contributorstring + contrib;\n counter++;\n });\n\n // //if the first entry is a group author a comma is not needed, otherwise it is\n // if (primaryType == 'groupAuthor') {\n // contributorstring = getReferenceName(primaryContributors[0]) + ' et al.';\n // }\n // else{\n // contributorstring = getReferenceName(primaryContributors[0]) + ', et al.';\n // }\n\n pluralLabel = true;\n }\n\n //if our primary is something other than an author...label it\n let contributorLabel = getContributorLabel(primaryType, pluralLabel);\n\n if (contributorLabel.length > 0 && !excludeRole) {\n contributorstring = contributorstring + ', ' + contributorLabel;\n }\n }\n\n return contributorstring.addClosure();\n}\n\nfunction getAuthorPartSort(refData, groupAuthorsAsAuthors){\n let contributorstring = '';\n\n if (typeof refData.contributors === 'undefined') {\n return contributorstring;\n }\n\n if (typeof groupAuthorsAsAuthors === 'undefined') {\n groupAuthorsAsAuthors = true;\n }\n\n let contributors = refData.contributors;\n\n contributors = removeEmptyContributors(contributors);\n\n if (contributors.length > 0) {\n\n let primaryType = getPrimaryContributorType(refData);\n let primaryContributors = getContributorsByType(primaryType, contributors);\n\n let index = 0;\n\n if (!groupAuthorsAsAuthors) {\n if (primaryType == 'author') {\n _forEach(primaryContributors, (contrib) => {\n if (typeof contrib !== 'undefined') {\n if (contrib.type == 'groupAuthor') {\n primaryContributors.splice(index, 1);\n }\n }\n \n index++;\n });\n }\n }\n\n //throw the contrib strings in an array before we build\n _forEach(primaryContributors, (contrib) => {\n let contribString = getReferenceName(contrib);;\n \n contributorstring = contributorstring + ' ';\n contributorstring = contributorstring + contribString;\n });\n }\n\n return contributorstring;\n}\n\nfunction getContributorLabel(primaryType, pluralLabel){\n let contributorLabel = '';\n\n if (typeof primaryType === 'undefined') {\n return '';\n }\n\n if (typeof pluralLabel === 'undefined') {\n pluralLabel = false;\n }\n\n //if our primary is something other than an author...label it\n if (primaryType != 'author') {\n switch (primaryType) {\n case \"editor\":\n \n if (pluralLabel) {\n contributorLabel = 'eds.';\n }\n else{\n contributorLabel = 'ed.';\n }\n \n break;\n case \"translator\":\n case \"chapterTranslator\":\n \n if (pluralLabel) {\n contributorLabel = 'trans.';\n }\n else{\n contributorLabel = 'trans.';\n }\n\n break;\n case \"illustrator\":\n \n if (pluralLabel) {\n contributorLabel = 'ills.';\n }\n else{\n contributorLabel = 'ill.';\n }\n\n break;\n case \"narrator\":\n\n if (pluralLabel) {\n contributorLabel = 'narrs.';\n }\n else{\n contributorLabel = 'narr.';\n }\n \n break;\n case \"performer\":\n case \"groupPerformer\":\n if (pluralLabel) {\n contributorLabel = 'performers';\n }\n else{\n contributorLabel = 'performer';\n }\n \n break;\n case \"host\":\n if (pluralLabel) {\n contributorLabel = 'hosts';\n }\n else{\n contributorLabel = 'host';\n }\n \n break;\n } \n }\n\n return contributorLabel;\n}\n\nfunction getCitationAuthorPart(refData, titleProperty, isSubsequent, omitGroupAuthors){\n let contributorstring = '';\n\n if (typeof refData.contributors === 'undefined') {\n refData.contributors = [];\n }\n\n if (typeof isSubsequent === 'undefined') {\n isSubsequent = false;\n }\n\n if (typeof omitGroupAuthors === 'undefined') {\n omitGroupAuthors = false;\n }\n\n let contributors = refData.contributors;\n\n contributors = removeEmptyContributors(contributors);\n\n if (typeof titleProperty === 'undefined') {\n return '';\n }\n\n if (contributors.length > 0) {\n\n //determine the type of the first listed contributor\n //then grab all of that type\n\n // let primaryType = getStringValue(contributors[0].type);\n let primaryType = getPrimaryType(refData);\n let primaryContributors = getContributorsByType(primaryType, contributors);\n let pluralLabel = false;\n\n //group authors are omitted in the author portion of the first citation..not matching the ref\n //note this for websites\n if (omitGroupAuthors) {\n let index = 0;\n _forEach(primaryContributors, (contrib) => {\n\n if (contrib) {\n if (contrib.type == 'groupAuthor') {\n primaryContributors.splice(index, 1);\n }\n }\n index++;\n });\n }\n \n //1 - Last, First Middle Suffix.\n if (primaryContributors.length == 1) {\n contributorstring = getCitationName(primaryContributors[0], isSubsequent);\n } \n\n //2 - Last, First Middle Suffix., and First Middle Last Suffix.\n if (primaryContributors.length == 2) {\n // let commaChar = ',';\n // if (isSubsequent) {\n // commaChar = '';\n // }\n\n // contributorstring = getCitationName(primaryContributors[0], isSubsequent) + commaChar + ' and ' + getCitationName(primaryContributors[1], isSubsequent);\n contributorstring = getCitationName(primaryContributors[0], isSubsequent) + ' and ' + getCitationName(primaryContributors[1], isSubsequent);\n pluralLabel = true;\n }\n \n //3 - Last, First Middle Suffix., Last, First Middle Suffix., and First Middle Last Suffix.\n if (primaryContributors.length == 3) {\n contributorstring = getCitationName(primaryContributors[0], isSubsequent) + ', ' + getCitationName(primaryContributors[1], isSubsequent) + ', and ' + getCitationName(primaryContributors[2], isSubsequent);\n pluralLabel = true;\n }\n \n //3 or more - Last, First Middle Suffix, et al. \n if (primaryContributors.length > 3) {\n contributorstring = getCitationName(primaryContributors[0], isSubsequent) + ' et al.';\n pluralLabel = true;\n }\n\n if (!isSubsequent) {\n //if our primary is something other than an author...label it\n let contributorLabel = getContributorLabel(primaryType, pluralLabel);\n\n if (contributorLabel.length > 0) {\n contributorstring = contributorstring + ', ' + contributorLabel;\n }\n }\n }\n\n //check to make sure that the publisher string is not the same as the primary contributor\n //if so, if we have a title property, we need ot use it instead\n // let primaryRefString = getAuthorPart(refData);\n\n // if (primaryRefString.length == 0) {\n\n // contributorstring = '';\n\n // if (titleProperty.length > 0) {\n // let title = getStringValue(refData[titleProperty]);\n\n // if (title.length > 0) {\n // //if this is a description, remove the brackets and don't italicize\n // if (title.startsWith('[')) {\n // title = removeDescriptionFromTitle(title);\n\n // // title = shortenGroupName(title);\n // }\n // else{\n // // title = shortenGroupName(title);\n // title = title.toTitleCase();\n // }\n\n // contributorstring = title;\n // }\n // }\n // }\n \n return contributorstring;\n}\n\nfunction getCitationName(contributor, isSubsequent){\n var name = '';\n\n if (typeof isSubsequent === 'undefined') {\n isSubsequent = false;\n }\n\n switch (contributor.type) {\n case 'author':\n case 'chapterAuthor':\n case 'custom':\n case 'executiveProducer':\n case 'executiveDirector':\n case 'executiveDirectorProducer':\n case 'director':\n case 'writer':\n case 'writerDirector':\n case 'host':\n case 'interview':\n\n if (isSubsequent) {\n if(contributor.lastName){\n if (contributor.lastName.trim().length > 0) {\n name = name.appendData(contributor.lastName.trim())\n }\n }\n }\n else{\n if(contributor.firstName){\n if (contributor.firstName.trim().length > 0) {\n let firstName = contributor.firstName;\n\n //gonna assume this is an abbreviations\n if (firstName.length == 1 ) {\n firstName = firstName + '.';\n }\n\n name = firstName;\n }\n }\n \n if(contributor.middleName){\n if (contributor.middleName.trim().length > 0) {\n\n if (contributor.middleName.length == 1) {\n name = name + ' ' + contributor.middleName.toUpperCase() + \".\";\n }\n else\n {\n name = name.appendData(contributor.middleName); \n }\n \n }\n }\n \n if(contributor.lastName){\n if (contributor.lastName.trim().length > 0) {\n name = name.appendData(contributor.lastName.trim())\n }\n }\n\n if(contributor.suffix){\n if (contributor.suffix.trim().length > 0) {\n\n let suffix = contributor.suffix.trim();\n\n if (suffix.toLowerCase() == 'jr' \n || suffix.toLowerCase() == 'sr') {\n suffix = suffix + '.';\n }\n\n name = name.appendData(suffix);\n }\n }\n }\n \n break;\n case 'editor':\n case 'chapterTranslator':\n case 'translator':\n case 'narrator':\n case 'illustrator':\n case 'originalEditor':\n case 'performer':\n case 'chair':\n case 'reviewAuthor':\n case 'reviewDirector':\n case 'reviewWriter':\n case 'reviewWriterDirector':\n case 'reviewArtist':\n case 'reviewComposer':\n case 'reviewEditor':\n\n if (isSubsequent) {\n if(contributor.lastName){\n if (contributor.lastName.trim().length > 0) {\n name = name.appendData(contributor.lastName.trim())\n }\n }\n }\n else{\n if(contributor.firstName){\n if (contributor.firstName.trim().length > 0) {\n let firstName = contributor.firstName.trim();\n\n //gonna assume this is an abbreviations\n if (firstName.length == 1 ) {\n firstName = firstName + '.';\n }\n\n name = firstName;\n }\n }\n \n if(contributor.middleName){\n if (contributor.middleName.trim().length > 0) {\n name = name.appendData(contributor.middleName.getInitial()); \n }\n }\n \n if(contributor.lastName){\n if (contributor.lastName.trim().length > 0) {\n name = name.appendData(contributor.lastName.trim())\n }\n }\n\n if(contributor.suffix){\n if (contributor.suffix.trim().length > 0) {\n name = name.appendData(contributor.suffix.trim())\n }\n }\n\n if (contributor.type == 'chair') {\n name = name + ', chair'\n }\n }\n\n break;\n case 'userName':\n\n if (isSubsequent) {\n if(contributor.lastName){\n if (contributor.lastName.trim().length > 0) {\n name = name.appendData(contributor.lastName.trim())\n }\n }\n\n // if(contributor.name){\n // if (contributor.name.trim().length > 0) {\n\n // if (name.length == 0) {\n // name = name.appendData(contributor.name.trim());\n // }\n // else{\n // name = name.appendData(contributor.name.trim().parenthesis());\n // }\n // }\n // }\n\n if (name.length == 0) {\n if(contributor.name){\n if (contributor.name.trim().length > 0) {\n name = contributor.name.trim(); \n }\n }\n }\n }\n else{\n if(contributor.firstName){\n if (contributor.firstName.trim().length > 0) {\n name = contributor.firstName.trim(); \n }\n\n if (name.length == 1) {\n name = name + '.';\n }\n }\n\n if(contributor.middleName){\n if (contributor.middleName.trim().length > 0) {\n name = name.appendData(contributor.middleName.getInitial()); \n }\n }\n\n if(contributor.lastName){\n if (contributor.lastName.trim().length > 0) {\n name = name.appendData(contributor.lastName.trim())\n }\n }\n\n if(contributor.suffix){\n if (contributor.suffix.trim().length > 0) {\n name = name.appendData(contributor.suffix.trim())\n }\n }\n\n if(contributor.name){\n if (contributor.name.trim().length > 0) {\n\n if (name.length == 0) {\n name = name.appendData(contributor.name.trim());\n }\n else{\n name = name.appendData(contributor.name.trim().parenthesis());\n }\n }\n }\n }\n\n // Albert A. Authora (username1)\n // if (isSubsequent) {\n // if(contributor.lastName){\n // if (contributor.lastName.trim().length > 0) {\n // name = name.appendData(contributor.lastName.trim())\n // }\n // }\n // }\n // else{\n // if(contributor.firstName){\n // if (contributor.firstName.trim().length > 0) {\n // name = contributor.firstName.trim(); \n // }\n // }\n \n // if(contributor.middleName){\n // if (contributor.middleName.trim().length > 0) {\n // name = name.appendData(contributor.middleName.getInitial()); \n // }\n // }\n \n // if(contributor.lastName){\n // if (contributor.lastName.trim().length > 0) {\n // name = name.appendData(contributor.lastName.trim())\n // }\n // }\n\n \n // }\n\n // if(contributor.lastName){\n\t\t\t// \tif (contributor.lastName.trim().length == 0) {\n\t\t\t// \t\tname = '';\n\t\t\t// \t}\n\t\t\t// \telse{\n\t\t\t// \t\tname = contributor.lastName.trim(); \n\t\t\t// \t}\n\t\t\t// }\n \n // let userName = '';\n // //if we dont have a last name, check user name\n // if (contributor.name && name.length == 0) {\n // return contributor.name.trim();\n // }\n \n break;\n case 'groupAuthor':\n case 'reviewGroupArtist':\n case 'groupPerformer':\n \n if(contributor.groupName){\n\t\t\t\tname = contributor.groupName.trim();\n \n //since this is a group author, shorten\n // name = shortenGroupName(name);\n }\n \n if (!isSubsequent) {\n let contributorname = getStringValue(contributor.name);\n \n if (contributorname.length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n\n name = name + '(' + contributorname + ')';\n }\n }\n\n break;\n case 'testimony':\n \n if(contributor.firstName){\n name = contributor.firstName.trim();\n }\n\n if(contributor.lastName){\n\n if (contributor.lastName.trim().length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n \n name = name + contributor.lastName.trim(); \n }\n }\n\n break;\n case 'anonymous':\n if(contributor.name){\n name = contributor.name.trim();\n }\n \n break;\n }\n\n return name;\n}\n\nfunction getCitations(citationData, firstInfo, subsequentInfo, refData){\n\n let firstCitation = ''\n let subsequentCitation = '';\n let firstLocation = getCitationLocationString(citationData, false);\n let subsequentLocation = getCitationLocationString(citationData, true);\n\n //check to see if any data needs clearing out\n // if (citationData.namePart == 'false') {\n // firstInfo = '';\n // }\n \n if (firstInfo.length > 0) {\n firstCitation = firstInfo;\n }\n\n if (subsequentInfo.length > 0) {\n subsequentCitation = subsequentInfo;\n }\n\n let citationVolume = getCitationVolume(citationData);\n\n if (firstLocation.length > 0) {\n\n firstCitation = citationLocationPunctuation(firstCitation, citationData);\n\n //for multivolume books without at volume title, volume is included\n if ((refData.type == 'book' && refData.kind == 'multivolume') || refData.type == 'series') {\n let volume = getStringValue(refData.volume);\n let volumeTitle = getStringValue(refData.volumeTitle);\n\n if (volume.length == 0 && citationVolume.length > 0) {\n volume = citationVolume;\n citationVolume = '';\n }\n\n if (volume.length > 0 && volumeTitle.length == 0) {\n\n //if there is no volume title and there are multiple volumes listed in 'volume', \n //the volume number is omitted from the note and the user should put the specific volume number before the page number\n if (volume.includes('and') || volume.includes('&') || volume.includes(',')) {\n firstCitation = firstCitation + firstLocation;\n }\n else{\n\n if (citationVolume.length == 0) {\n volume = volume + ':';\n firstCitation = firstCitation + volume + firstLocation;\n }\n else{\n firstCitation = firstCitation + firstLocation;\n }\n }\n }\n else{\n firstCitation = firstCitation + firstLocation;\n }\n }\n else{\n firstCitation = firstCitation + firstLocation;\n }\n }\n\n if (subsequentLocation.length > 0) {\n \n subsequentCitation = citationLocationPunctuation(subsequentCitation, citationData);\n\n //for multivolume books, volume is included\n if ((refData.type == 'book' && refData.kind == 'multivolume') || refData.type == 'series') {\n\n let volume = getStringValue(refData.volume);\n let volumeTitle = getStringValue(refData.volumeTitle);\n let seriesTitle = getStringValue(refData.seriesTitle);\n\n if (volume.length > 0 && (seriesTitle.length > 0 || volumeTitle.length > 0)) {\n\n //if there is no volume title and there are multiple volumes listed in 'volume', \n //the volume number is omitted from the note and the user should put the specific volume number before the page number\n if (volume.includes('and') || volume.includes('&') || volume.includes(',')) {\n subsequentCitation = subsequentCitation + subsequentLocation;\n }\n else{\n if (citationVolume.length == 0) {\n volume = volume + ':';\n subsequentCitation = subsequentCitation + volume + subsequentLocation;\n }\n else{\n subsequentCitation = subsequentCitation + subsequentLocation;\n }\n }\n }\n else{\n subsequentCitation = subsequentCitation + subsequentLocation;\n }\n }\n else{\n subsequentCitation = subsequentCitation + subsequentLocation;\n }\n }\n\n //trim these back\n firstCitation = firstCitation.trim();\n\n //make sure neither citation ends with a , or ,\"\n if (firstCitation.endsWith(',')) {\n firstCitation = firstCitation.substr(0, firstCitation.length -1);\n }\n\n if (firstCitation.endsWith(',\"')) {\n firstCitation = firstCitation.substr(0, firstCitation.length -2) + '\"';\n }\n\n let citation = {\n first : firstCitation.addClosure().toString(),\n subsequent : subsequentCitation.addClosure().toString()\n }\n\n return citation;\n}\n\nfunction citationLocationPunctuation(citation, citationData){\n \n if (citation.length > 0) {\n //check our punctionation\n\n if (citation.endsWith('\\'\"')) {\n citation = citation.slice(0, -2) + ',\\'\" ';\n return citation;\n }\n\n if (citation.endsWith('\"')) {\n citation = citation.slice(0, -1) + ',\" ';\n return citation;\n }\n\n //if this has a punctuation, then a comma is not needed\n if (citation.endsWith('!') || citation.endsWith('!') ||\n citation.endsWith('?') || citation.endsWith('?')\n ){\n citation = citation + ' ';\n }\n else{\n //nothing special, add the comma\n citation = citation + ', ';\n }\n }\n\n return citation;\n}\n\nfunction getCitationLocationString(citationData, isSubsequent){\n var location = '';\n\n if (typeof isSubsequent === 'undefined') {\n isSubsequent = false;\n }\n\n let citationVolume = getCitationVolume(citationData);\n\n if (citationData.value == '' && citationData.type != 'actSceneLine' && citationVolume.length == 0) {\n return '';\n }\n\n switch (citationData.type) {\n case 'notdirect':\n location = '';\n break;\n case 'page':\n location = formatPageNumbers(citationData.value, false);\n\n if (isSubsequent) {\n //check for volume citation data\n if (citationVolume.length > 0) {\n if (location.length > 0) {\n location = citationVolume + ':' + location;\n }\n else{\n location = 'vol. ' + citationVolume;\n }\n }\n }\n\n break;\n case 'paragraph':\n var label = 'para.';\n\n // if (usePluralLabel(citationData.value)) {\n // label = 'para.'\n // }\n\n location = label + ' ' + citationData.value;\n break;\n case 'chapter':\n location = 'chap. ' + citationData.value;\n break;\n case 'track':\n location = 'track ' + citationData.value;\n break;\n case 'figure':\n var label = 'fig.';\n\n // if (usePluralLabel(citationData.value)) {\n // label = 'figs.'\n // }\n\n location = label + ' ' + citationData.value;\n break;\n case 'table':\n var label = 'table';\n\n // if (usePluralLabel(citationData.value)) {\n // label = 'tabs.'\n // }\n\n location = label + ' ' + citationData.value;\n break;\n case 'time':\n\n \n //this version is for the way film is formatted\n let value = '';\n //we need to reformat strings like 1:14:30 as 01:14:30\n let timeArray = [];\n\n if (citationData.value.includes(':')) {\n timeArray = citationData.value.split(\":\");\n }\n\n if (citationData.value.includes('/')) {\n timeArray = citationData.value.split(\"/\");\n }\n\n\n if (timeArray.length > 0) {\n let newTimeFormat = '';\n\n if (timeArray.length == 2) {\n newTimeFormat = '00';\n }\n\n timeArray.forEach(item => {\n \n let newItem = item;\n\n switch (item.length) {\n case 0:\n newItem = '00';\n break;\n case 1:\n newItem = '0' + item;\n break;\n }\n\n if (newTimeFormat.length > 0) {\n newTimeFormat = newTimeFormat + ':';\n }\n\n newTimeFormat = newTimeFormat + newItem;\n });\n\n value = newTimeFormat;\n }\n else{\n value = citationData.value;\n }\n \n location = value;\n \n break;\n case 'section':\n var label = 'sec.';\n\n if (usePluralLabel(citationData.value)) {\n label = 'secs.'\n }\n\n location = label + ' ' + citationData.value.ordinalToNumber();\n break;\n case 'actSceneLine':\n location = fixPageDash(citationData.value);\n location = location.split(\"/\").join(\".\");\n\n if (location.endsWith('.')) {\n location = location.substring(0, location.length - 1);\n }\n\n break;\n case 'other':\n case 'religious':\n\n location = citationData.label;\n //appendix is not a listed section type, but is listed as app in Tirabian\n location = location.replace('Appendix', 'app.');\n location = location.toLowerCase();\n\n if (citationData.label.length > 0) {\n location = location + ' ';\n }\n\n let citationValue = citationData.value;\n \n location = location + citationValue;\n break;\n }\n\n return location;\n}\n\nfunction usePluralLabel(value){\n let use = false;\n\n if (value.includes('-') || \n value.includes(':') ||\n value.includes('–')) {\n \n use = true;\n }\n\n return use;\n}\n\nfunction formatPageNumbers(pages, addLabel){\n\n if (typeof addLabel === 'undefined') {\n addLabel = true;\n }\n \n pages = fixPageDash(pages);\n\n // //for MLA, multiple pages are shortened and only add a + at the end\n // //so \"13–21, 27\" becomes \"13–21+\"\"\n // if (pages.includes(',')) {\n // let array = pages.split(\",\");\n\n // pages = array[0] + \"+\";\n // }\n\n //MLA also shortens page numbers in this way\n //1122–1128 becomes 1122–28\n //dupicate numbers have to have at least 2\n if (pages.includes('–')) {\n\n let hasPlus = false;\n if (pages.endsWith('+')) {\n hasPlus = true;\n pages = pages.slice(0, -1)\n }\n\n let array = pages.split(\"–\");\n\n if (isInteger(array[0]) && isInteger(array[1])) {\n if (array[0].length == array[1].length) {\n if (array[0].length > 2) {\n \n //loop each number until we find the one that doesnt match\n let match = -1;\n for (var i = 0; i < array[0].length; i++) {\n \n if (array[0][i] != array[1][i]) {\n \n if (match == -1) {\n match = i;\n }\n }\n }\n \n if (match != -1) {\n //if it's only the last number, we need to add one to it\n if ((match + 1) == array[1].length) {\n match = match - 1;\n }\n \n pages = array[0] + \"–\" + array[1].substring(match);\n }\n }\n }\n }\n\n //re-add our plus\n if (hasPlus) {\n pages = pages + '+';\n }\n }\n\n if (pages.length > 0 && addLabel) {\n var label = 'p.';\n if (pages.includes('-') || pages.includes('–') || pages.includes(':') || pages.includes('+')) {\n label = 'pp.';\n }\n\n pages = label + ' ' + pages;\n }\n\n return pages;\n}\n\nfunction isInteger(value) {\n return !isNaN(value) && \n parseInt(Number(value)) == value && \n !isNaN(parseInt(value, 10));\n }\n\nfunction getReferenceName(contributor){\n var name = '';\n\n switch (contributor.type) {\n case 'author':\n case 'chapterAuthor':\n case 'custom':\n case 'executiveProducer':\n case 'executiveDirector':\n case 'executiveDirectorProducer':\n case 'director':\n case 'writer':\n case 'writerDirector':\n case 'host':\n case 'interview':\n\n case 'editor':\n case 'chapterTranslator':\n case 'translator':\n case 'narrator':\n case 'illustrator':\n case 'originalEditor':\n case 'performer':\n case 'chair':\n case 'reviewAuthor':\n case 'reviewDirector':\n case 'reviewWriter':\n case 'reviewWriterDirector':\n case 'reviewArtist':\n case 'reviewComposer':\n case 'reviewEditor':\n // Last, First Middle Suffix.\n \tif(contributor.lastName){\n\t\t\t\tif (contributor.lastName.trim().length == 0) {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tname = contributor.lastName.trim(); \n\t\t\t\t}\n\t\t\t}\n\n if (contributor.firstName && contributor.firstName.trim().length > 0) {\n\n let firstName = contributor.firstName;\n\n //gonna assume this is an abbreviations\n if (firstName.length == 1 ) {\n firstName = firstName + '.';\n }\n\n name = name + ', ' + firstName;\n }\n\n\t\t\tif (contributor.middleName && contributor.middleName.trim().length > 0) {\n\n contributor.middleName = contributor.middleName.trim()\n\n if (contributor.firstName.trim().length == 0) {\n name = name + ',';\n }\n\n if (contributor.middleName.length == 1) {\n name = name + ' ' + contributor.middleName.toUpperCase() + \".\";\n }\n else\n {\n name = name + ' ' + contributor.middleName;\n }\n\n // contributor.middleName = contributor.middleName.trim();\n\n // if (name.length > 0 && contributor.firstName.trim().length == 0) {\n // name = name + \",\";\n // }\n\n // if (contributor.middleName.includes(\" \")) {\n // let middleArray = contributor.middleName.split(\" \");\n // let middleNameString = \"\";\n \n // for (var i = 0; i < middleArray.length; i++) {\n // if (middleNameString.length > 0) {\n // middleNameString = middleNameString + \" \";\n // }\n\n // middleNameString = middleNameString + middleArray[i].getInitial();\n // }\n\n // name = name + ' ' + middleNameString;\n // }\n // else{\n // name = name + ' ' + contributor.middleName.getInitial();\n // }\n }\n\n if (contributor.suffix && contributor.suffix.trim().length > 0) {\n\n if (contributor.suffix.toLowerCase() == 'junior') {\n contributor.suffix = 'Jr.';\n }\n\n if (contributor.suffix.toLowerCase() == 'senior') {\n contributor.suffix = 'Sr.';\n }\n\n // if (contributor.suffix.toLowerCase().startsWith('jr') ||\n // contributor.suffix.toLowerCase().startsWith('sr')) {\n \n name = name + ',';\n // }\n\n name = name + ' ' + contributor.suffix.trim();\n }\n\n if (contributor.type == 'chair') {\n name = name + ', chair'\n }\n\n break;\n case 'userName':\n\n // if(contributor.firstName){\n // if (contributor.firstName.trim().length > 0) {\n // name = contributor.firstName.trim(); \n // }\n // }\n\n // if(contributor.middleName){\n // if (contributor.middleName.trim().length > 0) {\n // name = name.appendData(contributor.middleName.getInitial()); \n // }\n // }\n\n // if(contributor.lastName){\n // if (contributor.lastName.trim().length > 0) {\n // name = name.appendData(contributor.lastName.trim())\n // }\n // }\n\n // if (contributor.suffix && contributor.suffix.trim().length > 0) {\n\n // if (contributor.suffix.toLowerCase() == 'junior') {\n // contributor.suffix = 'Jr.';\n // }\n\n // if (contributor.suffix.toLowerCase() == 'senior') {\n // contributor.suffix = 'Sr.';\n // }\n\n // if (contributor.suffix.toLowerCase().startsWith('jr') ||\n // contributor.suffix.toLowerCase().startsWith('sr')) {\n \n // name = name + ',';\n // }\n\n // name = name + ' ' + contributor.suffix.trim();\n // }\n\n // Last, First Middle Suffix.\n \tif(contributor.lastName){\n\t\t\t\tif (contributor.lastName.trim().length == 0) {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tname = contributor.lastName.trim(); \n\t\t\t\t}\n\t\t\t}\n\n if (contributor.firstName && contributor.firstName.trim().length > 0) {\n\n let firstName = contributor.firstName;\n\n if (firstName.length == 1) {\n firstName = firstName + '.';\n }\n\n name = name + ', ' + firstName;\n }\n\n\t\t\tif (contributor.middleName && contributor.middleName.trim().length > 0) {\n // name = name + ' ' + contributor.middleName;\n contributor.middleName = contributor.middleName.trim();\n\n if (name.length > 0 && contributor.firstName.trim().length == 0) {\n name = name + \",\";\n }\n\n if (contributor.middleName.includes(\" \")) {\n let middleArray = contributor.middleName.split(\" \");\n let middleNameString = \"\";\n \n for (var i = 0; i < middleArray.length; i++) {\n if (middleNameString.length > 0) {\n middleNameString = middleNameString + \" \";\n }\n\n middleNameString = middleNameString + middleArray[i].getInitial();\n }\n\n name = name + ' ' + middleNameString;\n }\n else{\n name = name + ' ' + contributor.middleName.getInitial();\n }\n }\n\n if (contributor.suffix && contributor.suffix.trim().length > 0) {\n\n if (contributor.suffix.toLowerCase() == 'junior') {\n contributor.suffix = 'Jr.';\n }\n\n if (contributor.suffix.toLowerCase() == 'senior') {\n contributor.suffix = 'Sr.';\n }\n\n // if (contributor.suffix.toLowerCase().startsWith('jr') ||\n // contributor.suffix.toLowerCase().startsWith('sr')) {\n \n name = name + ',';\n // }\n\n name = name + ' ' + contributor.suffix.trim();\n }\n\n let userName = '';\n \n if (contributor.name) {\n userName = contributor.name.trim();\n }\n\n if (userName.length > 0) {\n if (name.length > 0) {\n name = name + ' ' + userName.parenthesis();\n }\n else {\n name = userName;\n }\n }\n break;\n case 'groupAuthor':\n case 'reviewGroupArtist':\n case 'groupPerformer':\n if(contributor.groupName){\n\t\t\t\tname = contributor.groupName.trim();\n }\n \n let contributorname = getStringValue(contributor.name);\n \n if (contributorname.length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n\n name = name + '(' + contributorname + ')';\n }\n\n break;\n case 'testimony':\n \n if(contributor.firstName){\n name = contributor.firstName.trim();\n }\n\n if(contributor.lastName){\n\n if (contributor.lastName.trim().length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n \n name = name + contributor.lastName.trim(); \n }\n }\n\n break;\n case 'anonymous':\n if(contributor.name){\n name = contributor.name.trim();\n }\n \n break;\n }\n\n return name;\n}\n\nfunction getSecondaryReferenceName(contributor){\n var name = '';\n\n switch (contributor.type) {\n case 'author':\n case 'chapterAuthor':\n case 'custom':\n case 'executiveProducer':\n case 'executiveDirector':\n case 'executiveDirectorProducer':\n case 'director':\n case 'writer':\n case 'writerDirector':\n case 'host':\n case 'interview':\n\n case 'editor':\n case 'chapterTranslator':\n case 'translator':\n case 'narrator':\n case 'illustrator':\n case 'originalEditor':\n case 'performer':\n case 'chair':\n case 'reviewAuthor':\n case 'reviewDirector':\n case 'reviewWriter':\n case 'reviewWriterDirector':\n case 'reviewArtist':\n case 'reviewComposer':\n case 'reviewEditor':\n case 'volumeEditor':\n \n if (contributor.firstName && contributor.firstName.trim().length > 0) {\n\n let firstName = contributor.firstName;\n\n //gonna assume this is an abbreviations\n if (firstName.length == 1 ) {\n firstName = firstName + '.';\n }\n\n name = firstName;\n }\n\n if (contributor.middleName && contributor.middleName.trim().length > 0) {\n contributor.middleName = contributor.middleName.trim()\n\n if (contributor.middleName.length == 1) {\n name = name + ' ' + contributor.middleName.toUpperCase() + \".\";\n }\n else\n {\n name = name + ' ' + contributor.middleName;\n }\n }\n\n // if (contributor.middleName && contributor.middleName.trim().length > 0) {\n // name = name + ' ' + contributor.middleName.getInitial();\n // }\n\n if (contributor.lastName && contributor.lastName.trim().length > 0) {\n\n if (name.length > 0) {\n name = name + ' ';\n }\n \n name = name + contributor.lastName.trim();\n }\n\n var suffix = '';\n if (contributor.suffix && contributor.suffix.trim().length > 0) {\n suffix = contributor.suffix.trim();\n\n if (suffix.toLowerCase() == 'junior') {\n suffix = 'Jr.';\n }\n\n if (suffix.toLowerCase() == 'senior') {\n suffix = 'Sr.';\n }\n\n if (suffix.toLowerCase().startsWith('jr') ||\n suffix.toLowerCase().startsWith('sr')) {\n \n // name = name + ',';\n }\n }\n\n if (suffix.length > 0) {\n name = name + ' ' + suffix;\n\n if (!name.endsWith(\".\")) {\n name = name + '.'\n }\n }\n\n break;\n case 'userName':\n\n if (contributor.firstName && contributor.firstName.trim().length > 0) {\n\n //gonna assume this is an abbreviations\n if (contributor.firstName.length == 1 ) {\n name = contributor.firstName + '.';\n }\n else{\n name = contributor.firstName;\n }\n }\n \n if (contributor.middleName.length == 1) {\n name = name + ' ' + contributor.middleName.toUpperCase() + \".\";\n }\n else\n {\n name = name + ' ' + contributor.middleName;\n }\n\n if (contributor.lastName && contributor.lastName.trim().length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n \n name = name + contributor.lastName.trim();\n }\n\n var suffix = '';\n if (contributor.suffix && contributor.suffix.trim().length > 0) {\n suffix = contributor.suffix.trim();\n\n if (suffix.toLowerCase() == 'junior') {\n suffix = 'Jr.';\n }\n\n if (suffix.toLowerCase() == 'senior') {\n suffix = 'Sr.';\n }\n\n if (suffix.toLowerCase().startsWith('jr') ||\n suffix.toLowerCase().startsWith('sr')) {\n \n name = name + ',';\n }\n }\n\n if (suffix.length > 0) {\n name = name + ' ' + suffix;\n\n if (!name.endsWith(\".\")) {\n name = name + '.'\n }\n }\n\n let userName = '';\n \n if (contributor.name) {\n userName = contributor.name.trim();\n }\n \n //see if we have username only\n if (name.trim().length == 0) {\n \n name = userName;\n }\n else{\n if (userName.length > 0) {\n // name = name + ' [' + userName + ']';\n name = name + ' ' + userName.parenthesis();\n }\n }\n break;\n case 'groupAuthor':\n case 'reviewGroupArtist':\n case 'groupPerformer':\n if(contributor.groupName){\n\t\t\t\tname = contributor.groupName.trim();\n }\n \n let contributorname = getStringValue(contributor.name);\n \n if (contributorname.length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n\n name = name + '[' + contributorname + ']';\n }\n\n break;\n case 'testimony':\n \n if(contributor.firstName){\n name = contributor.firstName.trim();\n }\n\n if(contributor.lastName){\n\n if (contributor.lastName.trim().length > 0) {\n if (name.length > 0) {\n name = name + ' ';\n }\n \n name = name + contributor.lastName.trim(); \n }\n }\n\n break;\n }\n\n return name;\n}\n\nfunction getPrimaryContributorType(refData){\n let primaryType = '';\n\n if (typeof refData.contributors === 'undefined') {\n return primaryType;\n }\n\n let contributors =[];\n\n _forEach(refData.contributors, (item) => {\n let canBePrimary = true;\n\n //add any types here that cannot be a primary type\n if (item.type == 'originalEditor') {\n canBePrimary = false;\n }\n\n //translators can't be the primary on a translated book\n if (refData.type == 'book' && refData.kind == 'translated' && item.type == 'translator') {\n canBePrimary = false;\n }\n\n if (canBePrimary) {\n contributors.push(item);\n } \n });\n\n if (contributors.length > 0) {\n primaryType = getStringValue(contributors[0].type);\n }\n\n //if the primary type is not an author, verify that we don't have any authors\n if (primaryType !== 'author' && primaryType !== 'groupAuthor' && primaryType !== 'chapterAuthor') {\n let authorContribs = getContributorsByType('author', contributors);\n\n //we have authors, they just arent added first, make them primary anyways\n if (authorContribs.length > 0) {\n primaryType = 'author';\n }\n }\n\n return primaryType;\n}\n\nfunction getContributorsByType(type, contributors, matchSimilarTypes){\n let typeContribs = [];\n\n if (typeof contributors == 'undefined'){\n return typeContribs;\n }\n\n //sometimes we will want to grab all authors, users, group authors, etc as the same, sometimes we won't\n if (typeof matchSimilarTypes == 'undefined'){\n matchSimilarTypes = true;\n }\n\n _forEach(contributors, (item) => {\n if (item.type == type) {\n typeContribs.push(item);\n }\n\n if (matchSimilarTypes) {\n //for authors. we also need to group in Group Authors and Usernames\n if (type == 'author') {\n if (item.type == 'groupAuthor' || item.type == 'userName' || item.type == 'chapterAuthor') {\n typeContribs.push(item);\n }\n }\n\n if (type == 'groupAuthor') {\n if (item.type == 'author' || item.type == 'userName' || item.type == 'chapterAuthor') {\n typeContribs.push(item);\n }\n }\n\n if (type == 'userName') {\n if (item.type == 'groupAuthor' || item.type == 'author' || item.type == 'chapterAuthor') {\n typeContribs.push(item);\n }\n }\n\n if (type == 'chapterAuthor') {\n if (item.type == 'groupAuthor' || item.type == 'author' || item.type == 'userName') {\n typeContribs.push(item);\n }\n }\n }\n\n });\n\n return typeContribs;\n}\n\nfunction getSecondaryContributorString(refData){\n\n let contributorstring = '';\n\n if (typeof refData.contributors === 'undefined') {\n return contributorstring;\n }\n\n refData.contributors = removeEmptyContributors(refData.contributors);\n\n if (refData.contributors.length > 0) {\n let primaryType = getPrimaryType(refData);\n\n // //if the primary type is not an author, verify that we don't have any authors\n // if (primaryType !== 'author' && primaryType !== 'groupAuthor') {\n // let authorContribs = getContributorsByType('author', contributors);\n\n // //we have authors, they just arent added first, make them primary anyways\n // if (authorContribs.length > 0) {\n // primaryType = 'author';\n // }\n // }\n\n let secondaryContributors = [];\n\n if (refData.type == 'series' && refData.kind == 'volume') {\n //for this type, we need to get volume editors\n secondaryContributors = getContributorsByType('volumeEditor', refData.contributors);\n }\n else{\n _forEach(refData.contributors, (item) => {\n if (item.type != primaryType) {\n \n //for authors, groupAuthors and userNames need to be filtered as well\n if (primaryType == 'author' || primaryType == 'groupAuthor' || primaryType == 'userName' || primaryType == 'chapterAuthor') {\n if (item.type != 'groupAuthor' && item.type != 'userName' && item.type != 'author' && item.type != 'chapterAuthor') {\n secondaryContributors.push(item);\n }\n }\n else {\n secondaryContributors.push(item);\n }\n }\n });\n }\n \n let seperateWithComma = false;\n\n //for book chapters, seperate with a comma instead of periods\n if (refData.type == 'bookChapter') {\n seperateWithComma = true;\n }\n\n if (secondaryContributors.length > 0) {\n //pull in this order: Authors, Editors, Translators, Illustrators, Narrators\n let typeStrings = [];\n\n let authors = getContributorsByType('author', secondaryContributors);\n let editors = getContributorsByType('editor', secondaryContributors);\n let translators = getContributorsByType('translator', secondaryContributors);\n let narrators = getContributorsByType('narrator', secondaryContributors);\n let illustrators = getContributorsByType('illustrator', secondaryContributors);\n let performers = getContributorsByType('performer', secondaryContributors);\n let groupPerformers = getContributorsByType('groupPerformer', secondaryContributors);\n let executiveProducers = getContributorsByType('executiveProducer', secondaryContributors);\n let editorTranslators = getEditorTranslators(secondaryContributors);\n let testimonies = getContributorsByType('testimony', secondaryContributors);\n let volumeEditors = getContributorsByType('volumeEditor', secondaryContributors);\n \n if (editorTranslators.length > 0) {\n editors = [];\n translators = [];\n }\n\n if (authors.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(authors, 'author'));\n }\n\n if (editors.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(editors, 'editor'));\n }\n\n if (translators.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(translators, 'translator'));\n }\n\n if (narrators.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(narrators, 'narrator'));\n }\n\n if (illustrators.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(illustrators, 'illustrator'));\n }\n\n if (performers.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(performers, 'performer'));\n }\n\n if (groupPerformers.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(groupPerformers, 'groupPerformer'));\n }\n\n if (editorTranslators.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(editorTranslators, 'editorTranslator'));\n }\n\n if (executiveProducers.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(executiveProducers, 'executiveProducer'));\n }\n\n if (testimonies.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(testimonies, 'testimony'));\n }\n\n if (volumeEditors.length > 0) {\n typeStrings.push(getSecondaryContributorTypeString(volumeEditors, 'volumeEditor'));\n }\n\n //now build out our strings\n if (typeStrings.length > 0) {\n \n let counter = 0;\n typeStrings.forEach(item => {\n\n if (seperateWithComma) {\n item = item.lowerFirstLetter();\n }\n\n if (counter == 0) {\n contributorstring = item;\n }\n else{\n if (seperateWithComma) {\n contributorstring = contributorstring + ', ' + item;\n }\n else{\n contributorstring = contributorstring + '. ' + item;\n }\n }\n \n counter++;\n });\n }\n }\n\n }\n\n return contributorstring;\n}\n\nfunction getSecondaryContributorTypeString(contributors, type, useLeadingCustomName){\n let contributorString = '';\n\n if (typeof useLeadingCustomName == 'undefined'){\n useLeadingCustomName = false;\n }\n\n switch (contributors.length) {\n case 0:\n contributorString = ''\n break;\n \n case 1:\n contributorString = getSecondaryReferenceName(contributors[0]);\n break;\n\n case 2:\n contributorString = getSecondaryReferenceName(contributors[0]) + ' and ' + getSecondaryReferenceName(contributors[1]);\n break;\n\n default:\n // contributorString = getSecondaryReferenceName(contributors[0]) + ' et al.';\n\n let counter = 1;\n let contribStringArray = [];\n _forEach(contributors, (contrib) => {\n let contribString = '';\n \n // if (counter == 1) {\n // contribString = getReferenceName(contrib);\n // }\n // else{\n contribString = getSecondaryReferenceName(contrib);\n // }\n\n contribStringArray.push(contribString);\n counter++;\n });\n\n counter = 1;\n contribStringArray.forEach(contrib => {\n if (counter > 1) {\n\n if (counter == contribStringArray.length) {\n contributorString = contributorString + ', and '\n }\n else{\n contributorString = contributorString + ', ';\n }\n }\n\n contributorString = contributorString + contrib;\n counter++;\n });\n\n break;\n }\n\n let name = '';\n\n if (contributorString.length > 0) {\n switch (type) {\n case \"author\":\n case \"reviewAuthor\":\n case \"reviewArtist\":\n case \"reviewGroupArtist\":\n contributorString = 'by ' + contributorString;\n break;\n case \"editor\":\n case \"originalEditor\":\n case \"volumeEditor\":\n contributorString = 'Edited by ' + contributorString;\n break;\n case \"translator\":\n case \"chapterTranslator\":\n contributorString = 'Translated by ' + contributorString;\n break;\n case \"illustrator\":\n contributorString = 'Illustrated by ' + contributorString;\n break;\n case \"narrator\":\n contributorString = 'Narrated by ' + contributorString;\n break;\n case \"testimony\":\n contributorString = 'Testimony of ' + contributorString;\n break;\n case \"actor\":\n contributorString = 'Featuring ' + contributorString;\n break;\n case \"performer\":\n case \"groupPerformer\":\n contributorString = 'Performance by ' + contributorString;\n break;\n case \"director\":\n contributorString = 'Directed by ' + contributorString;\n break;\n case \"host\":\n contributorString = 'Hosted by ' + contributorString;\n break;\n case \"writer\":\n contributorString = 'Written by ' + contributorString;\n break;\n case \"writerDirector\":\n contributorString = 'Directed and written by ' + contributorString;\n break;\n case \"editorTranslator\":\n contributorString = 'Edited and translated by ' + contributorString;\n break;\n case \"executiveProducer\":\n case \"producer\":\n contributorString = 'Produced by ' + contributorString;\n break;\n case \"chair\":\n contributorString = 'Chaired by ' + contributorString;\n break;\n case \"executiveDirector\":\n if (contributors.length == 1) {\n contributorString = contributorString + \", executive director\";\n }\n else{\n contributorString = contributorString + \", executive directors\";\n }\n break;\n case \"executiveDirectorProducer\":\n \n contributorString = 'Produced and directed by ' + contributorString;\n\n break;\n case \"reviewComposer\":\n\n //name = getStringValue(contributors[0].name);\n\n if (name.length > 0) {\n contributorString = contributorString + \", \" + name.toLowerCase();;\n }\n\n contributorString = 'by ' + contributorString;\n break;\n case \"custom\":\n\n name = getStringValue(contributors[0].name);\n\n if (name.length > 0) {\n\n if (useLeadingCustomName) {\n contributorString = name.toLowerCase() + ', ' + contributorString;\n contributorString = String(contributorString).upperFirstLetter();\n }\n else{\n contributorString = contributorString + \", \" + name.toLowerCase();\n }\n \n }\n\n break;\n } \n }\n\n return contributorString;\n}\n\nfunction getSecondaryContributorCitationString(refData){\n\n let contributorstring = '';\n\n if (typeof refData.contributors === 'undefined') {\n return contributorstring;\n }\n\n if (refData.contributors.length > 0) {\n // let primaryType = getStringValue(contributors[0].type);\n let primaryType = getPrimaryType(refData);\n\n let secondaryContributors = [];\n \n\t\t_forEach(refData.contributors, (item) => {\n if (item.type != primaryType) {\n\n //for authors, groupAuthors and userNames need to be filtered as well\n if (primaryType == 'author' || primaryType == 'groupAuthor' || primaryType == 'userName' || primaryType == 'chapterAuthor') {\n if (item.type != 'groupAuthor' && item.type != 'userName' && item.type != 'author' && item.type != 'chapterAuthor') {\n secondaryContributors.push(item);\n }\n }\n else {\n secondaryContributors.push(item);\n }\n }\n });\n\n if (secondaryContributors.length > 0) {\n //pull in this order: Authors, Editors, Translators, Illustrators, Narrators\n let typeStrings = [];\n\n let authors = getContributorsByType('author', secondaryContributors);\n let editors = getContributorsByType('editor', secondaryContributors);\n let translators = getContributorsByType('translator', secondaryContributors);\n let illustrators = getContributorsByType('illustrator', secondaryContributors);\n let narrators = getContributorsByType('narrator', secondaryContributors);\n let performers = getContributorsByType('performer', secondaryContributors);\n let groupPerformers = getContributorsByType('groupPerformer', secondaryContributors);\n let executiveProducers = getContributorsByType('executiveProducer', secondaryContributors);\n let editorTranslators = getEditorTranslators(secondaryContributors);\n let testimonies = getContributorsByType('testimony', secondaryContributors);\n \n if (editorTranslators.length > 0) {\n editors = [];\n translators = [];\n }\n\n if (authors.length > 0) {\n typeStrings.push(getSecondaryContributorCitationTypeString(authors, 'author'));\n }\n\n if (editors.length > 0) {\n typeStrings.push(getSecondaryContributorCitationTypeString(editors, 'editor'));\n }\n\n if (translators.length > 0) {\n typeStrings.push(getSecondaryContributorCitationTypeString(translators, 'translator'));\n }\n\n if (narrators.length > 0) {\n typeStrings.push(getSecondaryContributorCitationTypeString(narrators, 'narrator'));\n }\n\n if (illustrators.length > 0) {\n typeStrings.push(getSecondaryContributorCitationTypeString(illustrators, 'illustrator'));\n }\n\n if (performers.length > 0) {\n typeStrings.push(getSecondaryContributorCitationTypeString(performers, 'performer'));\n }\n\n if (groupPerformers.length > 0) {\n typeStrings.push(getSecondaryContributorCitationTypeString(groupPerformers, 'groupPerformer'));\n }\n\n if (editorTranslators.length > 0) {\n typeStrings.push(getSecondaryContributorCitationTypeString(editorTranslators, 'editorTranslator'));\n }\n\n if (executiveProducers.length > 0) {\n typeStrings.push(getSecondaryContributorCitationTypeString(executiveProducers, 'executiveProducer'));\n }\n\n if (testimonies.length > 0) {\n typeStrings.push(getSecondaryContributorCitationTypeString(testimonies, 'testimony'));\n }\n\n //now build out our strings\n if (typeStrings.length > 0) {\n \n let counter = 0;\n typeStrings.forEach(item => {\n\n if (counter == 0) {\n //item = item.charAt(0).toUpperCase() + item.slice(1)\n \n contributorstring = item;\n }\n else{\n contributorstring = contributorstring + ', ' + item;\n }\n \n counter++;\n });\n }\n }\n\n }\n\n return contributorstring;\n}\n\nfunction getSecondaryContributorCitationTypeString(contributors, type, useEtAl){\n let contributorString = '';\n\n if (typeof useEtAl === 'undefined') {\n useEtAl = false;\n }\n\n switch (contributors.length) {\n case 0:\n contributorString = ''\n break;\n \n case 1:\n contributorString = getSecondaryReferenceName(contributors[0]);\n break;\n\n case 2:\n contributorString = getSecondaryReferenceName(contributors[0]) + ' and ' + getSecondaryReferenceName(contributors[1]);\n break;\n\n default:\n if (useEtAl && contributors.length > 3) {\n contributorString = getSecondaryReferenceName(contributors[0]) + ' et al.';\n }\n else{\n let counter = 1;\n let contribStringArray = [];\n _forEach(contributors, (contrib) => {\n let contribString = '';\n \n contribString = getSecondaryReferenceName(contrib);\n\n contribStringArray.push(contribString);\n counter++;\n });\n\n counter = 1;\n contribStringArray.forEach(contrib => {\n if (counter > 1) {\n\n if (counter == contribStringArray.length) {\n contributorString = contributorString + ', and '\n }\n else{\n contributorString = contributorString + ', ';\n }\n }\n\n contributorString = contributorString + contrib;\n counter++;\n });\n }\n\n break;\n }\n\n if (contributorString.length > 0) {\n switch (type) {\n case \"author\":\n case \"reviewAuthor\":\n case \"reviewArtist\":\n case \"reviewGroupArtist\":\n contributorString = 'by ' + contributorString;\n break;\n case \"editor\":\n case \"originalEditor\":\n // if (contributors.length == 1) {\n contributorString = 'ed. ' + contributorString;\n // }\n // else{\n // contributorString = 'eds. ' + contributorString;\n // }\n\n break;\n case \"translator\":\n case \"chapterTranslator\":\n contributorString = 'trans. ' + contributorString;\n break;\n case \"illustrator\":\n contributorString = 'ill. ' + contributorString;\n break;\n case \"narrator\":\n contributorString = 'narr. ' + contributorString;\n break;\n case \"testimony\":\n contributorString = 'Testimony of ' + contributorString;\n break;\n case \"performer\":\n case \"groupPerformer\":\n contributorString = 'Performance by ' + contributorString;\n break;\n case \"director\":\n contributorString = 'Directed by ' + contributorString;\n break;\n case \"writer\":\n contributorString = 'Written by ' + contributorString;\n break;\n case \"writerDirector\":\n contributorString = 'Directed and Written by ' + contributorString;\n break;\n case \"editorTranslator\":\n contributorString = 'ed. and trans. ' + contributorString;\n break;\n case \"producer\":\n contributorString = 'Produced by ' + contributorString;\n break;\n case \"executiveProducer\":\n if (contributors.length == 1) {\n contributorString = contributorString + \", executive producer\";\n }\n else{\n contributorString = contributorString + \", executive producers\";\n }\n break;\n case \"chair\":\n if (contributors.length == 1) {\n contributorString = contributorString + \", chair\";\n }\n else{\n contributorString = contributorString + \", chairs\";\n }\n break;\n case \"executiveDirector\":\n if (contributors.length == 1) {\n contributorString = contributorString + \", executive director\";\n }\n else{\n contributorString = contributorString + \", executive directors\";\n }\n break;\n case \"executiveDirectorProducer\":\n \n contributorString = 'Produced and directed by ' + contributorString;\n\n break;\n case \"reviewComposer\":\n\n let name = getStringValue(contributors[0].name);\n\n if (name.length > 0) {\n contributorString = contributorString + \", \" + name.toLowerCase();;\n }\n break;\n case \"custom\":\n let customName = getStringValue(contributors[0].name);\n\n if (customName.length > 0) {\n contributorString = customName.toLowerCase() + ', ' + contributorString;\n }\n break;\n } \n }\n\n return contributorString;\n}\n\nfunction getEditorTranslators(contributors){\n\n let editorTranslatorString = '';\n let editorArray = [];\n\n if (typeof contributors === 'undefined') {\n return editorArray;\n }\n\n _forEach(contributors, (item) => {\n if (item.type == 'editor') {\n editorArray.push(item);\n }\n });\n\n let translatorArray = [];\n\n _forEach(contributors, (item) => {\n if (item.type == 'translator') {\n translatorArray.push(item);\n }\n });\n\n if (editorArray.length > 0 &&\n (editorArray.length == translatorArray.length)) {\n \n let same = true;\n\n //gonna loop each array and see if we have a match\n editorArray.forEach(thisEditor =>{\n \n var found = false;\n\n translatorArray.forEach(thisTranslator =>{\n if (thisEditor.firstName == thisTranslator.firstName &&\n thisEditor.middleName == thisTranslator.middleName &&\n thisEditor.lastName == thisTranslator.lastName &&\n thisEditor.prefix == thisTranslator.prefix &&\n thisEditor.suffix == thisTranslator.suffix) {\n found = true;\n } \n });\n\n if (found == false) {\n same = false;\n }\n });\n\n if (same) {\n return translatorArray;\n }\n }\n\n return [];\n}\n\nfunction getGroupAuthorCitationString(contributors){\n let groupAuthorString = '';\n\n if (typeof contributors == 'undefined'){\n return '';\n }\n \n let groupAuthors = getContributorsByType('groupAuthor', contributors, false);\n\n if (groupAuthors.length > 0) {\n\n groupAuthors.forEach(item => {\n groupAuthorString = groupAuthorString.appendData(item.groupName, ' ,');\n });\n }\n \n return groupAuthorString;\n}\n\nfunction getChapterTranslators(contributors){\n let translatorArray = [];\n\n contributors = removeEmptyContributors(contributors);\n\n _forEach(contributors, (item) => {\n if (item.type == 'chapterTranslator') {\n translatorArray.push(item);\n }\n });\n\n return translatorArray;\n}\n\nfunction getChapterTranslatorString(contributors){\n let translatorArray = [];\n let translatorString = '';\n\n if (typeof contributors === 'undefined') {\n return translatorArray;\n }\n\n contributors = removeEmptyContributors(contributors);\n\n let chapterTranslators = getChapterTranslators(contributors);\n\n switch (chapterTranslators.length) {\n case 0:\n return '';\n break;\n case 1:\n translatorString = getSecondaryReferenceName(chapterTranslators[0]);\n break;\n case 2:\n translatorString = getSecondaryReferenceName(chapterTranslators[0]) + ' and ' + getSecondaryReferenceName(chapterTranslators[1]);\n break;\n default:\n\n let contribStringArray = [];\n\n //throw the contrib strings in an array before we build\n let counter = 1;\n _forEach(chapterTranslators, (contrib) => {\n let contribString = '';\n \n contribString = getSecondaryReferenceName(contrib);\n\n contribStringArray.push(contribString);\n counter++;\n });\n\n counter = 1;\n contribStringArray.forEach(contrib => {\n if (counter > 1) {\n\n if (counter == contribStringArray.length) {\n translatorString = translatorString + ', and '\n }\n else{\n translatorString = translatorString + ', ';\n }\n }\n\n translatorString = translatorString + contrib;\n counter++;\n });\n\n break;\n }\n\n return 'Translated by ' + translatorString;\n}\n\nfunction getPublisherString(publishers, type, isCitation, verifyLocation, cleanNames){\n let publishersString = '';\n\n if (typeof publishers == 'undefined'){\n return '';\n }\n\n if (typeof verifyLocation == 'undefined'){\n verifyLocation = true;\n }\n\n //if a type is not passed in default to reference\n if (typeof type == 'undefined'){\n type = 'reference';\n }\n\n if (typeof isCitation === 'undefined') {\n isCitation = false;\n }\n\n if (typeof cleanNames === 'undefined') {\n cleanNames = true;\n }\n \n //filter these for type: reference\n let refPublishers = [];\n\n publishers.forEach(item => {\n if (item.type == type) {\n refPublishers.push(item);\n }\n });\n\n publishers = removeEmptyPublishers(publishers);\n\n // City, State: Publisher 1; Publisher 2; Publisher 3\n _forEach(refPublishers, (publisher) => {\n let publisherString = '';\n\n if (publisher.city) {\n if (publisher.city.length > 0) {\n publisherString = publisher.city;\n }\n }\n\n if (publisher.state) {\n if (publisher.state.length > 0) {\n\n if (publisherString.length > 0) {\n publisherString = publisherString + ', ';\n }\n \n publisherString = publisherString + publisher.state;\n }\n }\n\n let noPubLocation = false;\n if (publisherString.length == 0) {\n noPubLocation = true;\n }\n\n if (publisher.name) {\n if (publisher.name.length > 0) {\n if (publisherString.length > 0) {\n publisherString = publisherString + ': ';\n }\n\n let cleanName = publisher.name;\n\n if (cleanNames) {\n cleanName = getCleanPublisherName(publisher.name);\n }\n \n publisherString = publisherString + cleanName;\n }\n }\n\n if (publisherString.length > 0) {\n\n if (noPubLocation && verifyLocation) {\n let prefix = 'N.p.';\n\n if (isCitation || publishersString.length > 0) {\n prefix = prefix.toLowerCase();\n }\n\n publisherString = prefix + ': ' + publisherString;\n }\n \n if (publishersString.length > 0) {\n publishersString = publishersString + '; ';\n }\n\n publishersString = publishersString + publisherString;\n }\n\n });\n\n if (publishersString.length == 0 && verifyLocation) {\n if (isCitation) {\n publishersString = 'n.p.'; \n }\n else{\n publishersString = 'N.p.';\n }\n }\n \n return publishersString;\n}\n\nfunction getFullDateRange(startDate, endDate){\n\n //get the format for the start date, and we'll append the range to that\n let fullDate = getFullDate(startDate);\n\n let startYear = getYearFromDate(startDate);\n let startMonth = getMonthFromDate(startDate);\n let startDay = getDayFromDate(startDate);\n\n let endYear = getYearFromDate(endDate);\n let endMonth = getMonthFromDate(endDate);\n let endDay = getDayFromDate(endDate);\n\n //same year and month and day\n if (startYear == endYear && startMonth == endMonth && startDay == endDay) {\n return fullDate;\n }\n\n //same year and month\n if (startYear == endYear && startMonth == endMonth) {\n return endMonth + ' ' + startDay + '–' + endDay + ', ' + endYear \n }\n\n //same year\n if (startYear == endYear) {\n return startMonth + ' ' + startDay + '–' + endMonth + ' ' + endDay + ', ' + endYear \n }\n\n return fullDate + '–' + getFullDate(endDate);\n}\n\n\nfunction getYearFromDate(date){\n let year = '';\n var array = date.split(\"/\");\n\n switch (array.length) {\n case 3:\n if (array[2].length > 0) {\n year = dateHelper.format('1/1/' + array[2], 'yyyy');\n }\n break;\n case 2:\n if (array[1].length > 0) {\n year = dateHelper.format('1/1/' + array[1], 'yyyy');\n }\n break;\n case 1: \n if (array[0].length > 0) {\n year = dateHelper.format('1/1/' + array[0], 'yyyy');\n }\n break;\n }\n\n return year;\n}\n\nfunction getMonthFromDate(date){\n var array = date.split(\"/\");\n let month = '';\n\n switch (array.length) {\n case 3:\n if (array[0].length > 0) {\n month = dateHelper.format(array[0] + '/1/2020', 'mmmm');\n }\n\n break;\n case 2:\n if (array[0].length > 0) {\n month = dateHelper.format(array[0] + '/1/2020', 'mmmm');\n }\n\n break;\n }\n\n return month;\n}\n\nfunction getDayFromDate(date){\n var array = date.split(\"/\");\n let day = '';\n\n switch (array.length) {\n case 3:\n\n if (array[1].length > 0) {\n day = dateHelper.format('1/' + array[1] + '/2020', 'd');\n }\n break;\n }\n\n return day;\n}\n\n\n// new one added for Informal Works, might be user in other places\nfunction getPublisherStringInverted(publishers, isCitation, verifyLocation){\n let publishersString = '';\n\n if (typeof publishers == 'undefined'){\n return '';\n }\n\n if (typeof isCitation === 'undefined') {\n isCitation = false;\n }\n\n if (typeof verifyLocation == 'undefined'){\n verifyLocation = true;\n }\n \n //filter these for type: reference\n let refPublishers = [];\n\n publishers.forEach(item => {\n if (item.type == 'reference') {\n refPublishers.push(item);\n }\n });\n\n publishers = removeEmptyPublishers(publishers);\n\n // Publisher 1, City, State; Publisher 2, City, State;\n _forEach(refPublishers, (publisher) => {\n let publisherString = '';\n\n if (publisher.name) {\n if (publisher.name.length > 0) {\n if (publisherString.length > 0) {\n publisherString = publisherString + ': ';\n }\n\n let cleanName = getCleanPublisherName(publisher.name);\n \n publisherString = cleanName;\n }\n }\n\n if (publisher.city) {\n if (publisher.city.length > 0) {\n\n if (publisherString.length > 0) {\n publisherString = publisherString + ', ';\n }\n\n publisherString = publisherString + publisher.city;\n \n }\n }\n\n if (publisher.state) {\n if (publisher.state.length > 0) {\n\n if (publisherString.length > 0) {\n publisherString = publisherString + ', ';\n }\n \n publisherString = publisherString + publisher.state;\n }\n }\n\n let noPubLocation = false;\n if (publisherString.length == 0) {\n noPubLocation = true;\n }\n\n \n\n if (publisherString.length > 0) {\n\n if (noPubLocation) {\n let prefix = 'N.p.';\n\n if (isCitation || publishersString.length > 0) {\n prefix = prefix.toLowerCase();\n }\n\n publisherString = prefix + ': ' + publisherString;\n }\n \n if (publishersString.length > 0) {\n publishersString = publishersString + '; ';\n }\n\n publishersString = publishersString + publisherString;\n }\n\n });\n\n if (publishersString.length == 0 && verifyLocation) {\n if (isCitation) {\n publishersString = 'n.p.'; \n }\n else{\n publishersString = 'N.p.';\n }\n }\n\n return publishersString;\n}\n\n\nfunction getCleanPublisherName(name){\n \n if (typeof name == 'undefined'){\n return '';\n }\n\n let cleanName = ' ' + name + ' ';\n\n // //\"Publisher removes '& Co.', 'Co.', 'The' 'Inc.', 'Ltd.', 'S.A.', 'Publishing Co.', '& Company', 'Company', 'Incorporated', 'Limited', 'and Company', 'Publishing Company'.\",\n let removalWords = ['& Co.', 'The', 'Inc.', 'Ltd.', 'S.A.', 'Publishing Co.', '& Company', 'Incorporated', 'Limited', 'and Company', 'Publishing Company', 'Co.', 'Company',];\n\n _forEach(removalWords, (removalWord) => {\n cleanName = cleanName.replace(' ' + removalWord + ' ', ' ');\n });\n\n cleanName = cleanName.trim();\n\n return cleanName;\n}\n\nfunction fixFormatString(format){\n\n if (typeof format == 'undefined'){\n return '';\n }\n\n if (format == 'e-book') {\n return 'E-book';\n }\n \n return format;\n}\n\nfunction fixFormatStringForCitation(format){\n\n //If the format is a generic format, then it is not capitalized in the first citation. Generics include: e-book, ebook, audiobook. These are still capitalized in the reference because they follow a period.\n if (typeof format == 'undefined'){\n return '';\n }\n\n if (format.toLowerCase() == 'e-book') {\n return 'e-book';\n }\n\n if (format.toLowerCase() == 'ebook') {\n return 'ebook';\n }\n\n if (format.toLowerCase() == 'audiobook') {\n return 'audiobook';\n }\n\n if (format.toLowerCase() == 'kindle') {\n return 'Kindle';\n }\n \n return format;\n}\n\nfunction fixEditionString(edition){\n\n if (typeof edition == 'undefined'){\n return '';\n }\n\n if (edition.length > 0) {\n\n //if this is an integer, make it ordinal\n if (edition.isInteger()) {\n edition = edition.getOrdinalValue();\n\n edition = edition + \" ed.\";\n }\n\n edition = edition.replace('Edition', 'ed');\n\n //add ed if needed\n if (!edition.includes(' ed.') &&\n !edition.toLowerCase().includes(' edition') &&\n !edition.includes(' ed')) {\n edition = edition + ' ed.'\n }\n \n // //if the string includes ed., is not at the end, and does not follow with a comma, add it\n // if (edition.includes('ed.') &&\n // !edition.endsWith('ed.') &&\n // !edition.includes('ed.,')) {\n // edition = edition.replace('ed.', 'ed.,');\n // }\n }\n \n return edition;\n}\n\nfunction convertNumberToText (num) {\n\n var th = ['','thousand','million', 'billion','trillion'];\n var dg = ['zero','one','two','three','four', 'five','six','seven','eight','nine'];\n var tn = ['ten','eleven','twelve','thirteen', 'fourteen','fifteen','sixteen', 'seventeen','eighteen','nineteen'];\n var tw = ['twenty','thirty','forty','fifty', 'sixty','seventy','eighty','ninety'];\n\n num = num.toString();\n num = num.replace(/[\\, ]/g,'');\n if (num != parseFloat(num)) return num;\n var x = num.indexOf('.');\n\n if (x == -1)\n x = num.length;\n\n if (x > 15)\n return num;\n\n var n = num.split(''); \n var str = '';\n var sk = 0;\n for (var i=0; i < x; i++) {\n if ((x-i)%3==2) { \n if (n[i] == '1') {\n str += tn[Number(n[i+1])] + ' ';\n i++;\n sk=1;\n } else if (n[i]!=0) {\n str += tw[num[i]-2] + ' ';\n sk=1;\n }\n } else if (n[i]!=0) { // 0235\n str += dg[n[i]] +' ';\n if ((x-i)%3==0) str += 'hundred ';\n sk=1;\n }\n if ((x-i)%3==1) {\n if (sk)\n str += th[(x-i-1)/3] + ' ';\n sk=0;\n }\n }\n\n if (x != num.length) {\n var y = num.length;\n str += 'point ';\n for (var i=x+1; i]+)>)/ig, '');\n}\n\nfunction getPrimaryType(refData){\n\n let primaryType = '';\n\n if (typeof refData.contributors === 'undefined') {\n return primaryType;\n }\n\n let contributors =[];\n\n _forEach(refData.contributors, (item) => {\n let canBePrimary = true;\n\n //add any types here that cannot be a primary type\n if (item.type == 'originalEditor') {\n canBePrimary = false;\n }\n\n //translators can't be the primary on a translated book\n if (refData.type == 'book' && refData.kind == 'translated' && item.type == 'translator') {\n canBePrimary = false;\n }\n\n if (canBePrimary) {\n contributors.push(item);\n } \n });\n\n if (contributors.length == 0) {\n return '';\n }\n else{\n primaryType = getStringValue(contributors[0].type);\n }\n\n //if the primary type is not an author, verify that we don't have any authors\n if (primaryType !== 'author' && primaryType !== 'groupAuthor') {\n let authorContribs = getContributorsByType('author', contributors);\n\n //we have authors, they just arent added first, make them primary anyways\n if (authorContribs.length > 0) {\n primaryType = 'author';\n }\n }\n\n return primaryType;\n}\n\nfunction removeEmptyContributors(contributors){\n \n //remove any empty contributors from the array\n if (typeof contributors === 'undefined') {\n return [];\n }\n\n let cleanContributors = [];\n\n if (contributors.length > 0) {\n _forEach(contributors, (contributor) => {\n \n if (typeof contributor.type !== 'undefined') {\n\n switch (contributor.type) {\n case 'author':\n case 'chapterAuthor':\n case 'custom':\n case 'executiveProducer':\n case 'executiveDirector':\n case 'executiveDirectorProducer':\n case 'director':\n case 'writer':\n case 'writerDirector':\n case 'host':\n case 'interview':\n \n if(contributor.lastName.length > 0 ||\n contributor.firstName.length > 0 ||\n contributor.middleName.length > 0 ||\n contributor.suffix.length > 0){\n cleanContributors.push(contributor);\n }\n\n break;\n case 'editor':\n case 'chapterTranslator':\n case 'translator':\n case 'narrator':\n case 'illustrator':\n case 'originalEditor':\n case 'performer':\n case 'chair':\n case 'reviewAuthor':\n case 'reviewDirector':\n case 'reviewWriter':\n case 'reviewWriterDirector':\n case 'reviewArtist':\n case 'reviewComposer':\n case 'reviewEditor':\n case 'volumeEditor':\n\n if(contributor.lastName.length > 0 ||\n contributor.firstName.length > 0 ||\n contributor.middleName.length > 0 ||\n contributor.suffix.length > 0){\n cleanContributors.push(contributor);\n }\n \n break;\n case 'userName':\n \n if(contributor.lastName.length > 0 ||\n contributor.firstName.length > 0 ||\n contributor.middleName.length > 0 ||\n contributor.suffix.length > 0 ||\n contributor.name.length > 0){\n cleanContributors.push(contributor);\n }\n\n break;\n case 'groupAuthor':\n case 'reviewGroupArtist':\n\n if (typeof contributor.groupName === 'undefined') {\n break;\n }\n\n if(contributor.groupName.length > 0){\n cleanContributors.push(contributor);\n }\n\n break;\n case 'groupPerformer':\n\n if (typeof contributor.groupName === 'undefined') {\n break;\n }\n\n if (typeof contributor.abbreviation === 'undefined') {\n break;\n }\n\n if(contributor.groupName.length > 0 ||\n contributor.abbreviation.length > 0){\n cleanContributors.push(contributor);\n }\n\n break;\n case 'testimony':\n\n if(contributor.lastName.length > 0 ||\n contributor.firstName.length > 0){\n cleanContributors.push(contributor);\n }\n \n break;\n case 'anonymous':\n\n if (typeof contributor.name === 'undefined') {\n break;\n }\n\n if(contributor.name.length > 0){\n cleanContributors.push(contributor);\n }\n\n break;\n }\n }\n \n });\n }\n\n return cleanContributors;\n}\n\nfunction removeEmptyPublishers(publishers) {\n //remove any empty publishers from the array\n if (typeof publishers === 'undefined') {\n return [];\n }\n\n let cleanPublishers = [];\n\n if (publishers.length > 0) {\n\n _forEach(publishers, (publisher) => {\n let foundSomething = false;\n \n if (typeof publisher.type !== 'undefined') {\n if (publisher.type.length > 0) {\n foundSomething = true;\n }\n }\n\n if (typeof publisher.city !== 'undefined') {\n if (publisher.city.length > 0) {\n foundSomething = true;\n }\n }\n\n if (typeof publisher.name !== 'undefined') {\n if (publisher.name.length > 0) {\n foundSomething = true;\n }\n }\n\n if (typeof publisher.state !== 'undefined') {\n if (publisher.state.length > 0) {\n foundSomething = true;\n }\n }\n\n if (foundSomething) {\n cleanPublishers.push(publisher);\n }\n\n });\n\n }\n\n return cleanPublishers;\n}\n\nfunction getCitationVolume(citationData) {\n let volume = getStringValue(citationData.volume);\n\n return volume;\n}\n\nfunction replaceWithAbbreviations(text){\n\n text = text.replaceAll('Appendix', 'App.');\n text = text.replaceAll('Book', 'Bk.');\n text = text.replaceAll('Chapter', 'Chap.');\n text = text.replaceAll('Figure', 'Fig.');\n text = text.replaceAll('Manuscript', 'MS');\n text = text.replaceAll('Page', 'P.');\n text = text.replaceAll('Paragraph', 'Para.');\n text = text.replaceAll('Part', 'Pt.');\n text = text.replaceAll('Section', 'Sec.');\n text = text.replaceAll('Supplement', 'Supp.');\n text = text.replaceAll('Series', 'Ser.');\n text = text.replaceAll('Volume', 'Vol.');\n\n return text;\n}\n\nfunction isSelfPublished(refData){\n let isSelf = false;\n\n let primaryType = getPrimaryContributorType(refData);\n let primaryContributors = getContributorsByType(primaryType, refData.contributors);\n\n if (typeof refData.publishers === 'undefined') {\n return false;\n }\n\n if (primaryContributors.length == 1 && refData.publishers.length == 1) {\n if (primaryContributors[0].type == 'groupAuthor') {\n if (primaryContributors[0].groupName == refData.publishers[0].name) {\n isSelf = true;\n }\n }\n }\n\n return isSelf;\n}\n\nfunction removeDescriptionFromTitle(title)\n{\n title = title.trim();\n\n if (title.startsWith('[')) {\n title = title.slice(1);\n\n //remove the ending bracket too\n if (title.endsWith(']')) {\n title = title.slice(0, -1);\n }\n }\n\n return title;\n}\n\n// so far this is only used for runtime\n// update this so it comes in as a string not a controlled array\n\nfunction parseTimeStampString(timeStringIn){\n // 00:04:27 -> 4:27\n // 01:05:15 -> 1:05:27\n // 12:47 -> 12:47\n \n if(timeStringIn){\n if(timeStringIn.includes(':')){\n let timeArray = timeStringIn.split(':');\n\n // the time array can be different lengths based on data we get at this point\n switch(timeArray.length){\n case 1: // SS (assumed)\n return parseInt(timeArray[0]);\n \n case 2: // MM:SS (assumed)\n return parseInt(timeArray[0]) + ':' + timeArray[1];\n \n case 3: // HH:MM:SS\n if(timeArray[0] === '00'){\n // hour is blank, ignore it\n return parseInt(timeArray[1]) + ':' + timeArray[2];\n } else {\n // there is actual data for the hour\n return parseInt(timeArray[0]) + ':' + timeArray[1] + ':' + timeArray[2];\n }\n }\n } else {\n return timeStringIn;\n }\n \n }\n \n return '';\n}\n\nfunction isPublisherAndAuthorSame(refData){\n let isPublisherAndAuthorSame = false;\n\n // loop through each contributor\n _forEach(refData.contributors, (contributorBlock)=>{\n if(_has(contributorBlock, 'groupName') && contributorBlock.groupName !== ''){\n // this contributor has a groupname that is NOT blank, compare it\n \n // loop through each publisher\n _forEach(refData.publishers, (publisherBlock)=>{\n // console.log(publisherBlock);\n if(_has(publisherBlock, 'name') && publisherBlock.name === contributorBlock.groupName){\n // this publisher has a name that matches the contributor Group Name\n isPublisherAndAuthorSame = true;\n return false; // stop looping when you find one\n }\n });//e:forEach\n }\n });//e:forEach\n\n return isPublisherAndAuthorSame;\n}\n\nfunction getOrdinalValue(value){\n //https://stackoverflow.com/questions/13627308/add-st-nd-rd-and-th-ordinal-suffix-to-a-number\n if (isInteger(value)) {\n var j = value % 10,\n k = value % 100;\n if (j == 1 && k != 11) {\n return value + \"st\";\n }\n if (j == 2 && k != 12) {\n return value + \"nd\";\n }\n if (j == 3 && k != 13) {\n return value + \"rd\";\n }\n return value + \"th\";\n }\n\n return value;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\nconst { first } = require('lodash');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n\n if (titlePart.endsWith('.\"')) {\n if (publicationPart.startsWith('n.d.')) {\n publicationPart = publicationPart.upperFirstLetter();\n }\n }\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let type = shared.getStringValue(refData.type);\n let content = shared.getStringValue(refData.content);\n content = content.doubleQuote();\n\n if(type === 'post'){\n titlePart = titlePart.appendData(content);\n titlePart = titlePart.addClosure();\n }\n else{\n\n let title = shared.getStringValue(refData.title);\n title = title.replaceAmpersand().toTitleCase().doubleQuote();\n\n if (type == 'forum') {\n\n if (title.length > 0) {\n titlePart = titlePart.appendData('Reply to');\n }\n else{\n if (content.length > 0) {\n titlePart = titlePart.appendData(content);\n }\n }\n }\n\n titlePart = titlePart.appendData(title);\n titlePart = titlePart.addClosure();\n }\n\n // let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n // titlePart = titlePart.appendData(secondaryContributors);\n // titlePart = titlePart.addClosure();\n\n // let seriesTitle = shared.getStringValue(refData.seriesTitle);\n // seriesTitle = seriesTitle.toTitleCase();\n // titlePart = titlePart.appendData(seriesTitle);\n // titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n // if (shared.isSelfPublished(refData)) {\n // publicationPart = publicationPart.appendData('Self-published');\n // }\n // else{\n // let publisherString = shared.getPublisherString(refData.publishers);\n // publicationPart = publicationPart.appendData(publisherString);\n // }\n let title = shared.getStringValue(refData.title);\n let type = shared.getStringValue(refData.type);\n let platform = shared.getStringValue(refData.platform);\n\n if (title.length == 0 && type == 'forum' && platform.length > 0) {\n publicationPart = publicationPart.appendData('Reply on');\n }\n\n platform = platform.replaceAmpersand().toTitleCase();\n publicationPart = publicationPart.appendData(platform);\n\n let format = shared.getStringValue(refData.format);\n\n if (format.length == 0) {\n let attachment = shared.getStringValue(refData.attachment);\n attachment = attachment.toLowerCase();\n\n publicationPart = publicationPart.appendData(attachment, ', ');\n }\n\n publicationPart = publicationPart.appendData(format);\n\n let description = shared.getStringValue(refData.description);\n publicationPart = publicationPart.appendData(description);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n\n publicationPart = publicationPart.appendData(publicationDate, ', ');\n \n let time = shared.getStringValue(refData.time);\n publicationPart = publicationPart.appendData(time, ', ');\n\n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n // //format\n // let format = shared.getStringValue(refData.format);\n // format = shared.fixFormatString(format);\n // locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n let type = shared.getStringValue(refData.type);\n\n if(type === 'post'){\n citationTitle = shared.getStringValue(refData.content).replaceAmpersand();\n }\n else{\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let type = shared.getStringValue(refData.type);\n let titleProperty = 'title';\n \n if(type === 'post'){\n titleProperty = 'content';\n }\n \n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let content = shared.getStringValue(refData.content);\n content = content.doubleQuote();\n\n let title = shared.getStringValue(refData.title);\n\n if(type === 'post'){ \n firstInfo = firstInfo.appendData(content, \", \");\n }\n else{\n \n let seperator = \", \";\n if(type === 'forum'){\n \n if (title.length > 0) {\n firstInfo = firstInfo.appendData('reply to', \", \");\n seperator = ' ';\n\n if (firstInfo.startsWith('reply to')) {\n firstInfo = firstInfo.upperFirstLetter();\n }\n }\n else{\n if (content.length > 0) {\n firstInfo = firstInfo.appendData(content, \", \");\n }\n }\n }\n\n \n title = title.replaceAmpersand().toTitleCase().doubleQuote();\n firstInfo = firstInfo.appendData(title, seperator);\n }\n\n let platform = shared.getStringValue(refData.platform);\n\n if (title.length == 0 && type == 'forum' && platform.length > 0) {\n firstInfo = firstInfo.appendData('reply on', ', ');\n firstInfo = firstInfo.appendData(platform);\n }\n else{\n firstInfo = firstInfo.appendData(platform, ', ');\n }\n\n let format = shared.getStringValue(refData.format);\n\n if (format.length == 0) {\n let attachment = shared.getStringValue(refData.attachment);\n attachment = attachment.toLowerCase();\n firstInfo = firstInfo.appendData(attachment, ', ');\n }\n else{\n\n if (platform.length > 0) {\n firstInfo = firstInfo.appendData(format);\n }\n else{\n firstInfo = firstInfo.appendData(format, ', ');\n }\n }\n\n let description = shared.getStringValue(refData.description);\n firstInfo = firstInfo.appendData(description);\n\n let publicationDate = shared.getFullDate(refData.publicationDate);\n firstInfo = firstInfo.appendData(publicationDate, ', ');\n\n let time = shared.getStringValue(refData.time);\n firstInfo = firstInfo.appendData(time, ', ');\n\n // let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n // firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n // let description = shared.getStringValue(refData.description);\n // description = shared.replaceWithAbbreviations(description);\n // description = description.toLowerCase();\n // firstInfo = firstInfo.appendData(description, ', ');\n\n // let seriesTitle = shared.getStringValue(refData.seriesTitle);\n // workTitle = workTitle.toTitleCase();\n // firstInfo = firstInfo.appendData(seriesTitle, \", \");\n\n // let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true);\n // let publicationDate = shared.getFullDate(refData.publicationDate);\n // let publisherPart = '';\n\n // if (shared.isSelfPublished(refData)) {\n // publisherPart = publisherPart.appendData('self-pub.');\n // }\n // else{\n // publisherPart = publisherPart.appendData(publisherLocationString);\n // }\n\n // publisherPart = publisherPart.appendData(publicationDate, ', ');\n\n // publisherPart = publisherPart.parenthesis();\n // firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n // let format = shared.getStringValue(refData.format);\n // format = shared.fixFormatStringForCitation(format);\n \n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n // let articleNumber = shared.getStringValue(refData.articleNumber);\n // firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n // workTitle = shared.getStringValue(refData.workTitle);\n // workTitle = workTitle.shortenName().toTitleCase().italicize();\n\n // subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n\n title = shared.getStringValue(refData.title);\n title = title.replaceAmpersand().shortenName().toTitleCase().doubleQuote();\n content = shared.getStringValue(refData.content);\n\n if(type === 'post'){\n content = content.shortenName().doubleQuote();\n subsequentInfo = subsequentInfo.appendData(content, \", \");\n }\n else{\n\n let seperator = ', ';\n\n if(type === 'forum'){\n\n if (title.length > 0) {\n subsequentInfo = subsequentInfo.appendData('reply to', \", \");\n seperator = \" \";\n\n if (subsequentInfo.startsWith('reply to')) {\n subsequentInfo = subsequentInfo.upperFirstLetter();\n }\n }\n else{\n if (content.length > 0) {\n\n if (subsequentInfo.length > 0) {\n subsequentInfo = subsequentInfo.appendData(\"reply to\", ', ');\n content = content.shortenName().doubleQuote();\n subsequentInfo = subsequentInfo.appendData(content)\n }\n else{\n content = content.shortenName().doubleQuote();\n subsequentInfo = subsequentInfo.appendData(content, \", \")\n }\n }\n }\n }\n\n if (title.length > 0) {\n subsequentInfo = subsequentInfo.appendData(title, seperator);\n }\n }\n\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let isEntryDesctiption = false;\n\n let entry = shared.getStringValue(refData.entry);\n if (entry.startsWith('[')) {\n isEntryDesctiption = true;\n entry = shared.removeDescriptionFromTitle(entry);\n } else{\n entry = entry.replaceAmpersand().toTitleCase().doubleQuote();\n }\n \n titlePart = titlePart.appendData(entry, \", \", '', 'in');\n\n let workTitle = shared.getStringValue(refData.title);\n \n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n if(isEntryDesctiption){\n workTitle = workTitle.toLowerCase();\n }\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n }\n\n \n \n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n let version = shared.getStringValue(refData.version);\n titlePart = titlePart.appendData(version, ' ', 'V.');\n titlePart = titlePart.addClosure();\n\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let publisherString = shared.getPublisherString(refData.publishers, 'reference', false, false);\n if (publisherString.length == 0) {\n publisherString = 'N.p.';\n }\n\n publicationPart = publicationPart.appendData(publisherString);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n\n if(publicationDate === ''){\n publicationPart = publicationPart.appendData('n.d.', ', ');\n } else {\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n publicationPart = publicationPart.addClosure();\n }\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //platform\n let platform = shared.getStringValue(refData.platform);\n platform = shared.fixFormatString(platform);\n locationPart = locationPart.appendData(platform).addClosure();\n\n // url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let isEntryDesctiption = false;\n \n let entry = shared.getStringValue(refData.entry);\n if (entry.startsWith('[')) {\n isEntryDesctiption = true;\n entry = shared.removeDescriptionFromTitle(entry);\n if(authorPart.length > 0){\n entry = entry.toLowerCase();\n }\n } else{\n entry = entry.replaceAmpersand().toTitleCase().doubleQuote();\n }\n firstInfo = firstInfo.appendData(entry, \", \", '', 'in');\n\n let workTitle = shared.getStringValue(refData.title);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n if(isEntryDesctiption){\n workTitle = workTitle.toLowerCase();\n }\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n }\n\n if(entry.length === 0){\n firstInfo = firstInfo.appendData(workTitle, \", \");\n } else {\n firstInfo = firstInfo.appendData(workTitle); \n }\n \n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let version = shared.getStringValue(refData.version);\n version = version.toLowerCase();\n firstInfo = firstInfo.appendData(version, ', ', 'v.');\n\n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true, false);\n if (publisherLocationString.length == 0) {\n publisherLocationString = 'n.p.';\n }\n\n let publicationDate = shared.getFullDate(refData.publicationDate);\n let publisherPart = '';\n\n publisherPart = publisherPart.appendData(publisherLocationString);\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n\n publisherPart = publisherPart.parenthesis();\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let platform = shared.getStringValue(refData.platform);\n firstInfo = firstInfo.appendData(platform, ', ');\n\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.title);\n \n if(entry.length === 0){\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase();\n } else{\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().italicize();\n\n }\n\n \n } else {\n workTitle = entry;\n }\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const _cloneDeep = require('lodash/cloneDeep');\nconst shared = require('../Turabian9/Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n specialRules\n};\n\nfunction specialRules(references){\n\tlet _references = [];\n\n //iterarate each reference to update it's value\n references.forEach((thisReference) => {\n\t\t// clone thisReference so i can manipulate it\n\t\tlet _thisReference = _cloneDeep(thisReference);\n\t\t\n let typeName = getTypeShortName(_thisReference.referenceTypeID);\n \n let typeEngine = getTypeEngine(typeName);\n let engineRef;\n let refDataObject; \n \n if (typeof _thisReference.data === 'string') {\n refDataObject = JSON.parse((_thisReference.data));\n }\n else{\n refDataObject = _thisReference.data;\n }\n\n engineRef = typeEngine.getReference(refDataObject);\n \n _thisReference.authorPart = engineRef.authorPart;\n _thisReference.authorPartNoLabel = engineRef.authorPartNoLabel;\n _thisReference.authorPartSort = engineRef.authorPartSort;\n _thisReference.sameAuthorPartID = 0;\n _thisReference.citationTitle = engineRef.citationTitle;\n _thisReference.citationShortTitle = engineRef.citationShortTitle;\n _thisReference.citationDefaultShortTitle = engineRef.citationDefaultShortTitle;\n\n _thisReference.displayValue = engineRef.value;\n _thisReference.orderByValue = shared.getOrderByValue(_thisReference);\n\n let citationData = new Object;\n citationData.namePart = true;\n citationData.datePart = true;\n citationData.label = '';\n citationData.value = '';\n citationData.type = 'notdirect';\n \n _thisReference.indirectCitation = typeEngine.getCitation(refDataObject, citationData, references);\n\n //update the citations for this reference\n if (_thisReference.citations != undefined) {\n\n //see if this is a simgle object, or an array\n if (Array.isArray(_thisReference.citations)) {\n\n let counter = 1;\n\n _thisReference.citations.forEach(thisCitation => {\n\n thisCitation.turabian9 = typeEngine.getCitation(refDataObject, thisCitation.citationData, references);\n // thisCitation.displayValue = thisCitation.turabian9.first;\n\n if (counter > 1 && thisCitation.turabian9.subsequent != '') {\n thisCitation.displayValue = thisCitation.turabian9.subsequent;\n }\n else{\n thisCitation.displayValue = thisCitation.turabian9.first;\n }\n \n counter++;\n });\n }\n else{\n if (typeof _thisReference.citations === 'object' && _thisReference.citations !== null) {\n _thisReference.citations.turabian9 = typeEngine.getCitation(refDataObject, _thisReference.citations.citationData, references);\n _thisReference.citations.displayValue = _thisReference.citations.turabian9.first; \n }\n }\n }\n\t _references.push(_thisReference);\n\n });//e:forEach\n\n //initial sort\n orderRefs(_references);\n\n //Same author parts\n sameAuthorParts(_references);\n \n //Grouped Citations\n groupedCitations(_references);\n\n // console.log(_references);\n\n return _references;\n}\n\nfunction getTypeShortName(id){\n\n //swap the ID to the short name from types.json\n var typeData = require('../types.json');\n let typeShortName = '';\n\n if (isInteger(id)) {\n id = id.toString();\n }\n\n typeData.refTypes.forEach(thisType => {\n if (thisType.id == id) {\n typeShortName = thisType.shortname;\n }\n });\n\n return typeShortName;\n }\n\nfunction getTypeEngine(type){\n var typeEngine = null;\n\n typeEngine = require('./Turabian9-' + type +'.js');\n\n return typeEngine;\n}\n\nfunction groupedCitations(references){\n\n //iterate and see if we have any grouped citations in the paper\n let groupCitationIds = [];\n\n references.forEach(thisRef => {\n\n if (thisRef.citations != undefined) {\n\n if (Array.isArray(thisRef.citations)) {\n for (var i = 0; i < thisRef.citations.length; i++) {\n let thisCitation = thisRef.citations[i];\n\n if (thisCitation.groupUniqueID != undefined) {\n if (thisCitation.groupUniqueID.length > 0) {\n\n //make sure this group id is not already in the list\n let found = false;\n groupCitationIds.forEach(thisGroupCitationID => {\n if (thisGroupCitationID.toUpperCase() == thisCitation.groupUniqueID.toUpperCase()) {\n found = true;\n }\n });\n\n if (!found) {\n groupCitationIds.push(thisCitation.groupUniqueID.toUpperCase());\n }\n\n }\n }\n }//e:for:citations\n }\n else{\n if (thisRef.citations.groupUniqueID != undefined) {\n if (thisRef.citations.groupUniqueID.length > 0) {\n //make sure this group id is not already in the list\n let found = false;\n groupCitationIds.forEach(thisGroupCitationID => {\n if (thisGroupCitationID.toUpperCase() == thisRef.citations.groupUniqueID.toUpperCase()) {\n found = true;\n }\n });\n\n if (!found) {\n groupCitationIds.push(thisRef.citations.groupUniqueID.toUpperCase());\n }\n }\n }\n }\n }\n\n });//e:for:references\n\n //process each group ID now\n groupCitationIds.forEach(thisGroupID => {\n\n let groupCitations = [];\n\n references.forEach(thisRef => {\n if (thisRef.citations != undefined) {\n\n if (Array.isArray(thisRef.citations)) {\n thisRef.citations.forEach(thisCitation =>{\n\n if (thisCitation.groupUniqueID != undefined) {\n if (thisCitation.groupUniqueID.toUpperCase() == thisGroupID.toUpperCase()) {\n groupCitations.push(thisCitation);\n }\n }\n\n });//e:for:citations\n }\n else{\n if (thisRef.citations.groupUniqueID != undefined) {\n if (thisRef.citations.groupUniqueID.toUpperCase() == thisGroupID.toUpperCase()) {\n groupCitations.push(thisRef.citations);\n }\n }\n }\n }\n });//e:for:references\n\n //sort our citations by createOrder\n groupCitations.sort((a, b) => {\n let numberA = Number(a.createOrder);\n let numberB = Number(b.createOrder);\n\n return numberA < numberB ? -1 : numberA > numberB ? 1 : 0;\n });//e:sort\n\n //make a pass through now to get our new value\n let groupValue = '';\n let lastCitationUsed = ''\n\n groupCitations.forEach(thisCitation => {\n\n let thisDisplay = thisCitation.displayValue;\n\n if (thisDisplay.startsWith('(')) {\n thisDisplay = thisDisplay.substring(1, thisDisplay.length);\n }\n\n if (thisDisplay.endsWith(')')) {\n thisDisplay = thisDisplay.substring(0, thisDisplay.length -1);\n }\n\n let displayToUse = thisDisplay;\n\n //loop through until we find the part of this citation that start to differ from the last one we used\n // let found = false;\n // for (let i = 0; i < displayToUse.length; i++) {\n\n // if (!found) {\n\n // let thisChar = displayToUse.charAt(i);\n\n // if (isInteger(thisChar)) {\n // displayToUse = displayToUse.substring(i, displayToUse.length);\n // found = true;\n // }\n // else{\n // if (displayToUse.charAt(i) != lastCitationUsed.charAt(i)) {\n // displayToUse = displayToUse.substring(i, displayToUse.length);\n // found = true;\n // } \n // } \n // }\n // }\n\n lastCitationUsed = thisDisplay;\n\n if (displayToUse.length > 0) {\n if (groupValue.length > 0) {\n \n if (groupValue.endsWith('.')) {\n groupValue = groupValue.substring(0, groupValue.length -1);\n }\n\n groupValue = groupValue + '; ';\n }\n\n groupValue = groupValue + displayToUse;\n }\n\n });//e:for:group citations\n\n // if (groupValue.length > 0) {\n // groupValue = '(' + groupValue + ')';\n // }\n\n //now go back and set the display value back\n groupCitations.forEach(thisCitation => {\n thisCitation.displayValue = groupValue;\n });//e:for:group citations\n\n });\n\n}\n\nfunction sameAuthorParts(references){\n //see which references have the same author date parts\n let sameAuthorPartID = 1; \n let sameAuthorPartIDs = [];\n\n references.forEach(thisReference => {\n\n if (thisReference.authorPart != '' && thisReference.sameAuthorPartID == 0) {\n \n //inner loop for this reference\n let foundMatches = false;\n references.forEach(innerReference => {\n if (innerReference.referenceUniqueID != thisReference.referenceUniqueID &&\n innerReference.authorPartNoLabel == thisReference.authorPartNoLabel\n ) \n {\n //we found a matching author and date part\n foundMatches = true;\n thisReference.sameAuthorPartID = sameAuthorPartID;\n innerReference.sameAuthorPartID = sameAuthorPartID;\n }\n });\n\n //if we found a match, increment our id\n if (foundMatches) {\n sameAuthorPartIDs.push(sameAuthorPartID);\n sameAuthorPartID++;\n }\n }\n \n });\n\n //change any authors after the initial entry to only be ---\n sameAuthorPartIDs.forEach(thisSameID =>{\n let matchingRefs = [];\n\n references.forEach(thisReference => {\n if (thisReference.sameAuthorPartID == thisSameID) {\n matchingRefs.push(thisReference);\n }\n });\n\n let counter = 0;\n matchingRefs.forEach(thisReference => {\n \n if (counter > 0) {\n\n let dashReplacement = '———';\n\n if (thisReference.authorPart == thisReference.authorPartNoLabel) {\n dashReplacement = dashReplacement + '.';\n }\n\n thisReference.displayValue = thisReference.displayValue.replace(thisReference.authorPartNoLabel, dashReplacement);\n }\n \n counter++;\n });\n });\n\n //now we need to make sure that any subsequent citations do not match and have enough to identify\n sameAuthorPartIDs.forEach(thisSameID =>{\n let matchingRefs = [];\n\n references.forEach(thisReference => {\n if (thisReference.sameAuthorPartID == thisSameID) {\n matchingRefs.push(thisReference);\n }\n });\n\n let matchingShortNames = [];\n //going to start by getting all the citation short names that match\n matchingRefs.forEach(thisReference => {\n \n if (thisReference.citationDefaultShortTitle != '' ) {\n matchingRefs.forEach(innerReference => {\n \n if (innerReference.citationDefaultShortTitle == thisReference.citationDefaultShortTitle){\n\n let filteredArray = matchingShortNames.filter(obj => obj === innerReference.citationDefaultShortTitle);\n\n if (filteredArray.length == 0) {\n matchingShortNames.push(thisReference.citationDefaultShortTitle);\n }\n }\n \n });\n }\n \n });\n\n //we have short names that match, start doing work to extend them\n if (matchingShortNames.length > 0) {\n\n matchingShortNames.forEach(matchingShortName => {\n let matchingShortNameRefs = matchingRefs.filter(obj => obj.citationDefaultShortTitle === matchingShortName);\n \n //expand each short name until this is cleared up\n let i = 0;\n while (matchingShortNameRefs.length > 1) {\n\n //expand each array\n matchingShortNameRefs.forEach(matchingShortNameRef => {\n matchingShortNameRef.citationShortTitle = expandShortName(matchingShortNameRef.citationShortTitle, matchingShortNameRef.citationTitle);\n });\n\n //lets look at them now and remove any that are not duplicated\n let index = 0;\n matchingShortNameRefs.forEach(matchingShortNameRef => {\n let updatedMatches = matchingRefs.filter(obj => obj.citationShortTitle === matchingShortNameRef.citationShortTitle);\n \n if (updatedMatches.length == 1) {\n //if this only has one match, it is itself, so it is unique and we can clear this one from our to-do list\n matchingShortNameRefs.splice(index, 1);\n }\n\n index++;\n });\n\n //just a while short circuit, worst case scenarios\n if (i==1000) {\n break;\n }\n\n i++;\n }\n });\n }\n\n //now go back thru each of the references and see if they have subsuquents, and update them\n matchingRefs.forEach(thisReference => {\n\n if (thisReference.citations != undefined) {\n if (thisReference.citations.length > 1) {\n\n let i = 0;\n thisReference.citations.forEach(thisCitation => {\n \n if (i > 0) {\n thisCitation.displayValue = thisCitation.displayValue.replace(thisReference.citationDefaultShortTitle, thisReference.citationShortTitle)\n }\n \n i++;\n });\n }\n }\n \n });\n });\n\n}\n\nfunction orderRefs(references){\n //order the results\n references.sort((a, b) => {\n let textA = '';\n let textB = '';\n\n if (a.orderByValue !== null) {\n textA = a.orderByValue;\n }\n\n if (b.orderByValue !== null) {\n textB = b.orderByValue;\n }\n\n if (textA.length > 0) {\n textA = textA.toUpperCase();\n }\n\n if (textB.length > 0) {\n textB = textB.toUpperCase();\n }\n\n return textA < textB ? -1 : textA > textB ? 1 : 0;\n });//e:sort\n}\n\nfunction expandShortName(shortName, fullName){\n let newShortName = shortName;\n\n if (shortName == fullName) {\n return fullName;\n }\n else{\n let restOfShortName = fullName.replace(shortName, '');\n restOfShortName = restOfShortName.trimStart();\n\n let words = restOfShortName.split(\" \");\n\n let done = false;\n words.forEach(word => {\n \n if (!done) {\n //only add one word, unless ...\n //\"Do not stop on a conjunction (and, or, but) or article (a, an, the)\"\n let continueWords = ['and', 'or', 'but', 'a', 'an', 'the'];\n let isContinue = continueWords.includes(word.toLowerCase());\n\n newShortName = newShortName + ' ' + word;\n\n if (!isContinue) {\n done = true;\n } \n }\n });\n }\n\n return newShortName;\n}\n\nfunction isInteger(value) {\n return !isNaN(value) && \n parseInt(Number(value)) == value && \n !isNaN(parseInt(value, 10));\n }","const shared = require('./Turabian9-Shared.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.title);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n }\n\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n // let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n // titlePart = titlePart.appendData(secondaryContributors);\n // titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n\n let publisherString = shared.getPublisherString(refData.publishers, 'reference', false, true);\n\n if(publicationDate === 'n.d.'){\n publicationPart = publicationPart.appendData(publisherString);\n\n } else {\n publicationPart = publicationPart.appendData(publicationDate, ', ', 'Recorded');\n publicationPart = publicationPart.addClosure();\n\n publicationPart = publicationPart.appendData(publisherString);\n }\n \n let copyrightYear = shared.getStringValue(refData.copyrightYear);\n if (copyrightYear.length === 0) {\n publicationPart = publicationPart.appendData('n.d.', ', ');\n \n } else {\n publicationPart = publicationPart.appendData(copyrightYear, ', ');\n publicationPart = publicationPart.addClosure();\n }\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n // url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle);\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let workTitle = shared.getStringValue(refData.title);\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize();\n }\n \n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n \n let publisherPart = '';\n let publicationDate = shared.getFullDate(refData.publicationDate);\n \n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true, true);\n\n if(publicationDate === 'n.d.'){\n publisherPart = publisherPart.appendData(publisherLocationString);\n\n } else {\n publisherPart = publisherPart.appendData(publisherLocationString);\n firstInfo = firstInfo.appendData(publicationDate, ', ', 'recorded');\n\n }\n\n let copyrightYear = shared.getStringValue(refData.copyrightYear);\n if (copyrightYear.length === 0) {\n publisherPart = publisherPart.appendData('n.d.', ', ');\n } else {\n publisherPart = publisherPart.appendData(copyrightYear, ', ');\n }\n\n firstInfo = firstInfo.appendData(publisherPart.parenthesis(), ', ');\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.title);\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle).shortenName();\n } else{\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().italicize();\n }\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(locationPart);\n\n \n let citationShortTitle = shared.getStringValue(refData.shortTitle);\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n\n let workTitle = shared.getStringValue(refData.title).replaceAmpersand();\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n let volume = shared.getStringValue(refData.volume);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n\n if(type === 'federal'){\n if(kind === 'usc'){\n titlePart = titlePart.appendData(('US Code').italicize());\n titlePart = titlePart.appendData(volume).addClosure();\n titlePart = titlePart.appendData(publicationDate).addClosure();\n\n let sectionOutput = formatSectionString(refData);\n titlePart = titlePart.appendData(sectionOutput).addClosure();\n\n } else if(kind === 'pl'){\n let number = shared.getStringValue(refData.number);\n titlePart = titlePart.appendData(number, ' ', 'Public Law').addClosure();\n titlePart = titlePart.appendData(('US Statutes at Large').italicize());\n titlePart = titlePart.appendData(volume).addClosure();\n titlePart = titlePart.appendData(publicationDate).addClosure();\n }\n\n } else if(type === 'state'){\n let state = shared.getStringValue(refData.state);\n titlePart = titlePart.appendData(state);\n\n let sourceTitle = shared.getStringValue(refData.sourceTitle);\n titlePart = titlePart.appendData(sourceTitle);\n titlePart = titlePart.appendData(publicationDate).addClosure();\n\n let sourceLocation = shared.getStringValue(refData.sourceLocation);\n titlePart = titlePart.appendData(sourceLocation).addClosure();\n \n\n }//e:if:else:type\n \n \n // let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n // titlePart = titlePart.appendData(secondaryContributors);\n // titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\n\nfunction formatSectionString(refData){\n let section = shared.getStringValue(refData.section);\n let sectionStringOutput = '';\n \n let suffix = 'et seq.';\n let array = [];\n\n // split section based on various dash options\n if (section.includes('-')) {\n array = section.split(\"-\");\n\n } else if (section.includes('–')) {\n array = section.split(\"–\");\n\n } else if (section.includes('—')) {\n array = section.split(\"—\");\n\n }\n \n if(array.length > 0){\n // there was dash manipulation\n sectionStringOutput = sectionStringOutput.appendData(array[0], '', '§§', suffix);\n } else {\n // there was no dash (array should be empty)\n sectionStringOutput = sectionStringOutput.appendData(section, '', '§');\n }\n \n return sectionStringOutput;\n}\n\nfunction getCitationTitle(refData){\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let type = shared.getStringValue(refData.type);\n let kind = shared.getStringValue(refData.kind);\n \n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.title).replaceAmpersand();\n titlePart = titlePart.appendData(workTitle);\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let volume = shared.getStringValue(refData.volume);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n \n if(type === 'federal'){\n if(kind === 'usc'){\n titlePart = titlePart.appendData(('US Code').italicize(), ', ');\n \n titlePart = titlePart.appendData(volume);\n titlePart = titlePart.appendData(publicationDate.parenthesis());\n\n let sectionOutput = formatSectionString(refData);\n titlePart = titlePart.appendData(sectionOutput, ', ');\n\n } else if(kind === 'pl'){\n\n let number = shared.getStringValue(refData.number);\n titlePart = titlePart.appendData(number, ', ', 'Public Law');\n titlePart = titlePart.appendData(('US Statutes at Large').italicize(), ', ');\n titlePart = titlePart.appendData(volume);\n titlePart = titlePart.appendData(publicationDate.parenthesis());\n\n }\n\n } else if(type === 'state'){\n let state = shared.getStringValue(refData.state);\n titlePart = titlePart.appendData(state, ', ');\n\n let sourceTitle = shared.getStringValue(refData.sourceTitle);\n titlePart = titlePart.appendData(sourceTitle);\n titlePart = titlePart.appendData(publicationDate, ', ');\n\n let sourceLocation = shared.getStringValue(refData.sourceLocation);\n titlePart = titlePart.appendData(sourceLocation, ', ');\n\n }//e:if:else:type\n \n \n \n firstInfo = firstInfo.appendData(titlePart); \n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let url = shared.getStringValue(refData.url);\n url = shared.formatURL(url).addClosure();\n \n if(type === 'federal' && kind === 'pl'){\n firstInfo = firstInfo.appendData(url, ': ');\n } else {\n firstInfo = firstInfo.appendData(url, ', ');\n }\n \n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.title).replaceAmpersand();\n workTitle = shared.getStringValue(refData.shortTitle).replaceAmpersand();\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\nconst { first } = require('lodash');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let titlePart = getTitlePart(refData);\n let contribPart = getCustomContributorString(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(contribPart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(contribPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n title = title.replaceAmpersand().toTitleCase().italicize(); \n }\n\n titlePart = titlePart.appendData(title);\n titlePart = titlePart.addClosure();\n\n if (refData.type == 'episode') {\n // Season [seasonNumber], episode [episodeNumber], \\”[episodeTitle].\\”\n let seasonNumber = shared.getStringValue(refData.seasonNumber);\n\n if (seasonNumber.length > 0) {\n titlePart = titlePart.appendData('Season');\n titlePart = titlePart.appendData(seasonNumber);\n }\n\n let episodeNumber = shared.getStringValue(refData.episodeNumber);\n\n if (episodeNumber.length > 0) {\n if (seasonNumber.length > 0) {\n titlePart = titlePart.appendData('episode', ', ');\n }\n else{\n titlePart = titlePart.appendData('Episode');\n }\n\n titlePart = titlePart.appendData(episodeNumber);\n }\n \n let episodeTitle = shared.getStringValue(refData.episodeTitle);\n\n if (episodeTitle.length > 0) {\n \n if (episodeTitle.startsWith('[')) {\n episodeTitle = shared.removeDescriptionFromTitle(episodeTitle);\n } else{\n episodeTitle = episodeTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n if (titlePart.endsWith('.')) {\n titlePart = titlePart.appendData(episodeTitle);\n }\n else{\n titlePart = titlePart.appendData(episodeTitle, ', ');\n }\n }\n }\n\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getCustomContributorString(refData, isCitation){\n let contributorstring = '';\n\n if (typeof refData.contributors === 'undefined') {\n return contributorstring;\n }\n\n if (typeof isCitation === 'undefined') {\n isCitation = false;\n }\n\n let seperator = '. ';\n\n if (isCitation) {\n seperator = ', '\n }\n\n //https://docs.google.com/document/d/1SIlxeWd5XPEWXmxMiDaw5RVh-DfwzI7T82rD3m5tjL8/edit#heading=h.dsb2n2r5yilc\n /*\n The order of contributors is:\n Executive Producer & Producer: \tProduced by…\t\t\n Executive Director & Director\tDirected by…\t\t\t\n Director & Writer\t\t\tDirected and written by…\t\n Writer\t\t\t\t\tWritten by…\t\t\t\n Custom\t\t\t\tRole, …\t\t\tRole\n */\n \n let contributors = refData.contributors;\n\n contributors = shared.removeEmptyContributors(contributors);\n\n if (contributors.length > 0) {\n\n let producerContribs = [];\n let directorContribs = [];\n let writerContribs = [];\n let writerDirectorContribs = [];\n let directorProducerContribs = [];\n let customContribs = [];\n\n let useCombinedWriterDirector = false;\n let useCombinedDirectorProducer = false;\n\n let executiveDirectorArray = shared.getContributorsByType('executiveDirector', refData.contributors);\n let executiveProducerArray = shared.getContributorsByType('executiveProducer', refData.contributors);\n let directorArray = shared.getContributorsByType('director', refData.contributors);\n let writerDirectorArray = shared.getContributorsByType('writerDirector', refData.contributors);\n let writerArray = shared.getContributorsByType('writer', refData.contributors);\n let executiveDirectorProducerArray = shared.getContributorsByType('executiveDirectorProducer', refData.contributors);\n\n //this is weird one - this while type is\n //Only use writerDirector if there are no other directors, executievDirectors, or writers\n if (directorArray.length == 0 && executiveDirectorArray.length == 0 && writerArray.length == 0 && writerDirectorArray.length > 0) {\n useCombinedWriterDirector = true;\n }\n\n //Only use executiveDirectorProducer if there are no other executiveDirector, executiveProducer, director\n if (directorArray.length == 0 && executiveDirectorArray.length == 0 && executiveProducerArray.length == 0 && executiveDirectorProducerArray.length > 0) {\n useCombinedDirectorProducer = true;\n }\n\n _forEach(contributors, (item) => {\n switch (item.type) {\n case 'executiveDirector':\n directorContribs.push(item);\n break;\n case 'executiveProducer':\n producerContribs.push(item);\n break;\n case 'director':\n directorContribs.push(item);\n break;\n case 'writerDirector':\n\n if (useCombinedWriterDirector) {\n writerDirectorContribs.push(item);\n }\n else{\n directorContribs.push(item);\n writerContribs.push(item);\n }\n break;\n case 'writer':\n writerContribs.push(item);\n break;\n case 'executiveDirectorProducer':\n\n if (useCombinedDirectorProducer) {\n directorProducerContribs.push(item);\n }\n else{\n directorContribs.push(item);\n producerContribs.push(item);\n }\n break;\n case 'custom':\n customContribs.push(item);\n break;\n }\n });\n\n if (producerContribs.length > 0) {\n let producerString = '';\n \n if (isCitation) {\n producerString = shared.getSecondaryContributorCitationTypeString(producerContribs, 'producer', true);\n }\n else{\n producerString = shared.getSecondaryContributorTypeString(producerContribs, 'producer');\n }\n\n if (isCitation) {\n producerString = producerString.lowerFirstLetter();\n }\n\n contributorstring = contributorstring.appendData(producerString, seperator);\n }\n\n if (directorContribs.length > 0) {\n let directorString = '';\n \n if (isCitation) {\n directorString = shared.getSecondaryContributorCitationTypeString(directorContribs, 'director', true);\n }\n else{\n directorString = shared.getSecondaryContributorTypeString(directorContribs, 'director');\n }\n\n if (isCitation) {\n directorString = directorString.lowerFirstLetter();\n }\n\n contributorstring = contributorstring.appendData(directorString, seperator);\n }\n\n if (directorProducerContribs.length > 0) {\n let directorProducerString = '';\n \n if (isCitation) {\n directorProducerString = shared.getSecondaryContributorCitationTypeString(directorProducerContribs, 'executiveDirectorProducer', true);\n }\n else{\n directorProducerString = shared.getSecondaryContributorTypeString(directorProducerContribs, 'executiveDirectorProducer');\n }\n\n if (isCitation) {\n directorProducerString = directorProducerString.replace('Produced and Directed', 'produced and directed');\n }\n\n contributorstring = contributorstring.appendData(directorProducerString, seperator);\n }\n\n if (writerContribs.length > 0) {\n let writerString = '';\n \n if (isCitation) {\n writerString = shared.getSecondaryContributorCitationTypeString(writerContribs, 'writer', true);\n }\n else{\n writerString = shared.getSecondaryContributorTypeString(writerContribs, 'writer');\n }\n\n if (isCitation) {\n writerString = writerString.lowerFirstLetter();\n }\n\n contributorstring = contributorstring.appendData(writerString, seperator);\n }\n\n if (writerDirectorContribs.length > 0) {\n let writerDirectorString = '';\n \n if (isCitation) {\n writerDirectorString = shared.getSecondaryContributorCitationTypeString(writerDirectorContribs, 'writerDirector', true);\n }\n else{\n writerDirectorString = shared.getSecondaryContributorTypeString(writerDirectorContribs, 'writerDirector');\n }\n\n if (isCitation) {\n writerDirectorString = writerDirectorString.replace('Directed and Written', 'directed and written');\n }\n\n contributorstring = contributorstring.appendData(writerDirectorString, seperator);\n }\n\n if (customContribs.length > 0) {\n let customContribString = '';\n \n if (isCitation) {\n customContribString = shared.getSecondaryContributorCitationTypeString(customContribs, 'custom', true);\n }\n else{\n customContribString = shared.getSecondaryContributorTypeString(customContribs, 'custom', true);\n }\n\n if (isCitation) {\n customContribString = customContribString.lowerFirstLetter();\n }\n\n contributorstring = contributorstring.appendData(customContribString, seperator);\n }\n \n }\n\n if (!isCitation) {\n contributorstring = contributorstring.addClosure();\n }\n\n return contributorstring;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let channel = shared.getStringValue(refData.channel);\n let publicationDate = shared.getStringValue(refData.publicationDate);\n\n if (refData.type == 'series') {\n //On [channel]. [publishers]. [publicationDate].\n if (channel.length > 0) {\n publicationPart = publicationPart.appendData('On');\n publicationPart = publicationPart.appendData(channel).addClosure();\n }\n\n let publisherString = shared.getPublisherString(refData.publishers, 'reference', false, false, false);\n publicationPart = publicationPart.appendData(publisherString);\n publicationPart = publicationPart.addClosure();\n\n publicationDate = shared.getFullDate(publicationDate);\n \n if (refData.type == 'series') {\n publicationDate = publicationDate.replace(' - ', '–');\n publicationDate = publicationDate.replace(' – ', '–');\n\n publicationDate = publicationDate.replace('- ', '–');\n publicationDate = publicationDate.replace('– ', '–');\n }\n\n if (publicationPart.length == 0 && publicationDate == 'n.d.') {\n publicationDate = 'N.d.';\n }\n \n publicationPart = publicationPart.appendData(publicationDate);\n }\n\n if (refData.type == 'episode') {\n //Aired [publicationDate], on [channel].\n publicationDate = shared.getFullDate(publicationDate);\n \n if (publicationDate.length > 0 || channel.length > 0) {\n publicationPart = publicationPart.appendData('Aired');\n\n publicationPart = publicationPart.appendData(publicationDate);\n\n if (channel.length > 0) {\n\n if (publicationDate.length > 0) {\n publicationPart = publicationPart.appendData('on', ', ');\n }\n else{\n publicationPart = publicationPart.appendData('on');\n }\n\n publicationPart = publicationPart.appendData(channel).addClosure();\n }\n }\n }\n \n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n // url\n let url = shared.getStringValue(refData.url);\n \n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n // Series\n // [title], [contributors], on [channel] ([publishers], [publicationDate]), [location], [url].\n \n // Episode\n // [title], season [seasonNumber], episode [episodeNumber], \\”[episodeTitle],\\” [contributors], aired [publicationDate], on [channel], [location], [url].\n let title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = String(shared.removeDescriptionFromTitle(title));\n } else{\n title = title.replaceAmpersand().toTitleCase().italicize(); \n }\n\n firstInfo = firstInfo.appendData(title, \", \");\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let channel = shared.getStringValue(refData.channel);\n\n if (refData.type == 'series') {\n let contribPart = getCustomContributorString(refData, true);\n\n if (title.length > 0) {\n contribPart = contribPart.lowerFirstLetter();\n }\n\n firstInfo = firstInfo.appendData(contribPart, \", \");\n\n if (channel.length > 0) {\n firstInfo = firstInfo.appendData('on', ', ');\n firstInfo = firstInfo.appendData(channel)\n }\n\n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true, false, false);\n publicationDate = shared.getFullDate(publicationDate);\n publicationDate = publicationDate.replace(' - ', '–');\n publicationDate = publicationDate.replace(' – ', '–');\n\n publicationDate = publicationDate.replace('- ', '–');\n publicationDate = publicationDate.replace('– ', '–');\n\n let publisherPart = '';\n\n if (shared.isSelfPublished(refData)) {\n publisherPart = publisherPart.appendData('self-pub.');\n }\n else{\n publisherPart = publisherPart.appendData(publisherLocationString);\n }\n\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n\n publisherPart = publisherPart.parenthesis();\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n }\n\n if (refData.type == 'episode') {\n let seasonNumber = shared.getStringValue(refData.seasonNumber);\n\n if (seasonNumber.length > 0) {\n firstInfo = firstInfo.appendData('season', ', ');\n firstInfo = firstInfo.appendData(seasonNumber);\n }\n\n let episodeNumber = shared.getStringValue(refData.episodeNumber);\n\n if (episodeNumber.length > 0) {\n firstInfo = firstInfo.appendData('episode', ', ');\n firstInfo = firstInfo.appendData(episodeNumber);\n }\n \n let episodeTitle = shared.getStringValue(refData.episodeTitle);\n\n if (episodeTitle.length > 0) {\n \n if (episodeTitle.startsWith('[')) {\n episodeTitle = shared.removeDescriptionFromTitle(episodeTitle).toLowerCase();\n } else{\n episodeTitle = episodeTitle.replaceAmpersand().toTitleCase().doubleQuote(); \n }\n\n firstInfo = firstInfo.appendData(episodeTitle, ', ');\n }\n\n let contribPart = getCustomContributorString(refData, true);\n\n if (title.length > 0) {\n contribPart = contribPart.lowerFirstLetter();\n }\n\n firstInfo = firstInfo.appendData(contribPart, \", \");\n\n publicationDate = shared.getFullDate(publicationDate);\n if (publicationDate.length > 0 || channel.length > 0) {\n firstInfo = firstInfo.appendData('aired', \", \");\n\n firstInfo = firstInfo.appendData(publicationDate);\n\n if (channel.length > 0) {\n\n if (publicationDate.length > 0) {\n firstInfo = firstInfo.appendData('on', ', ');\n }\n else{\n firstInfo = firstInfo.appendData('on');\n }\n\n firstInfo = firstInfo.appendData(channel);\n }\n }\n }\n\n \n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n //remove leading 00s\n citationLocation = citationLocation.replace('00:0', '');\n citationLocation = citationLocation.replace('00:', '');\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = String(shared.removeDescriptionFromTitle(title).shortenName());\n } else{\n title = title.replaceAmpersand().shortenName().toTitleCase().italicize(); \n }\n \n subsequentInfo = subsequentInfo.appendData(title, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n let referenceValue = '';\n \n let type = shared.getStringValue(refData.type); \n\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n\n let authorPart = ''; \n let getAuthorPart = shared.getAuthorPart(refData); \n\n if(getAuthorPart.endsWith('.')) {\n getAuthorPart = getAuthorPart.substring(0, getAuthorPart.length - 1);\n }\n if(type === 'testimony'){\n authorPart = authorPart.appendData(getAuthorPart, '', 'statement of');\n authorPart = authorPart.parenthesis();\n authorPart = authorPart.addClosure();\n\n } else {\n referenceValue = referenceValue.addClosure();\n\n }\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n \n let type = shared.getStringValue(refData.type);\n\n let workTitle = shared.getStringValue(refData.title);\n\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n\n let committeeName = shared.getStringValue(refData.committeeName);\n committeeName = committeeName.italicize(); \n if(type === 'hearing'){\n titlePart = titlePart.appendData(committeeName, ' ', 'Hearing before the');\n } else {\n titlePart = titlePart.appendData(committeeName);\n }\n\n // session\n let session = shared.getStringValue(refData.session);\n session = shared.getOrdinalValue(session);\n \n if(committeeName.length > 0){\n titlePart = titlePart.appendData(session, ', ', '', 'Cong.');\n\n } else {\n titlePart = titlePart.appendData(session, ' ', '', 'Cong.');\n\n }\n \n // sessionPart\n let sessionPart = shared.getStringValue(refData.sessionPart);\n sessionPart = shared.getOrdinalValue(sessionPart);\n titlePart = titlePart.appendData(sessionPart, ', ', '', 'sess.');\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let kind = shared.getStringValue(refData.kind);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n publicationDate = publicationDate.parenthesis();\n publicationPart = publicationPart.appendData(publicationDate, ', ');\n\n if(kind.length === 0){\n publicationPart = publicationPart.addClosure();\n }\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n // url\n let url = shared.getStringValue(refData.url);\n \n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n locationPart = locationPart.addClosure();\n }\n \n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n let firstInfo = '';\n let subsequentInfo = '';\n\n let type = shared.getStringValue(refData.type);\n\n let workTitle = shared.getStringValue(refData.title);\n \n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().italicize(); \n }\n\n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n let committeeName = shared.getStringValue(refData.committeeName);\n committeeName = committeeName.italicize(); \n\n if(type === 'hearing'){\n firstInfo = firstInfo.appendData(committeeName, ', ', 'hearing before the');\n } else {\n firstInfo = firstInfo.appendData(committeeName, ', ');\n }\n\n // session\n let session = shared.getStringValue(refData.session);\n session = shared.getOrdinalValue(session);\n firstInfo = firstInfo.appendData(session, ', ', '', 'Cong.');\n\n // sessionPart\n let sessionPart = shared.getStringValue(refData.sessionPart);\n sessionPart = shared.getOrdinalValue(sessionPart);\n firstInfo = firstInfo.appendData(sessionPart, ', ', '', 'sess.');\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(refData.publicationDate);\n publicationDate = publicationDate.parenthesis();\n firstInfo = firstInfo.appendData(publicationDate, ', ');\n\n let authorPart = '';\n\n let getAuthorPart = shared.getAuthorPart(refData); \n\n if(getAuthorPart.endsWith('.')) {\n getAuthorPart = getAuthorPart.substring(0, getAuthorPart.length - 1);\n }\n \n if(type === 'testimony'){\n authorPart = authorPart.appendData(getAuthorPart, '', 'statement of');\n authorPart = authorPart.parenthesis();\n }\n \n firstInfo = firstInfo.appendData(authorPart);\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n\n let shortWorkTitle = shared.getStringValue(refData.shortTitle);\n if(shortWorkTitle.length > 0){\n shortWorkTitle = shortWorkTitle.replaceAmpersand().toTitleCase().italicize();\n\n } else {\n // there isn't a shortTitle found to use title\n shortWorkTitle = shared.getStringValue(refData.title);\n\n if (shortWorkTitle.startsWith('[')) {\n shortWorkTitle = shared.removeDescriptionFromTitle(shortWorkTitle);\n } else{\n shortWorkTitle = shortWorkTitle.replaceAmpersand().shortenName().toTitleCase().italicize();\n }\n }\n\n subsequentInfo = subsequentInfo.appendData(shortWorkTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n title = title.replaceAmpersand().toTitleCase().italicize();\n }\n\n titlePart = titlePart.appendData(title);\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n let number = shared.getStringValue(refData.number);\n titlePart = titlePart.appendData(number);\n titlePart = titlePart.addClosure();\n\n // let description = shared.getStringValue(refData.description);\n // description = shared.replaceWithAbbreviations(description);\n // titlePart = titlePart.appendData(description);\n // titlePart = titlePart.addClosure();\n\n // let seriesTitle = shared.getStringValue(refData.seriesTitle);\n // seriesTitle = seriesTitle.toTitleCase();\n // titlePart = titlePart.appendData(seriesTitle);\n // titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n if (shared.isSelfPublished(refData)) {\n publicationPart = publicationPart.appendData('Self-published');\n }\n else{\n let publisherString = shared.getPublisherString(refData.publishers);\n publicationPart = publicationPart.appendData(publisherString);\n }\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n publicationPart = publicationPart.appendData(publicationDate, ', ');\n \n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n\n if (authorPart.length > 0) {\n title = title.toLowerCase(); \n }\n }\n else{\n title = title.replaceAmpersand().toTitleCase().italicize();\n }\n\n firstInfo = firstInfo.appendData(title, \", \");\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n // let description = shared.getStringValue(refData.description);\n // description = shared.replaceWithAbbreviations(description);\n // description = description.toLowerCase();\n // firstInfo = firstInfo.appendData(description, ', ');\n\n // let seriesTitle = shared.getStringValue(refData.seriesTitle);\n // workTitle = workTitle.toTitleCase();\n // firstInfo = firstInfo.appendData(seriesTitle, \", \");\n\n let number = shared.getStringValue(refData.number);\n firstInfo = firstInfo.appendData(number, \", \");\n\n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true);\n let publicationDate = shared.getFullDate(refData.publicationDate);\n let publisherPart = '';\n\n if (shared.isSelfPublished(refData)) {\n publisherPart = publisherPart.appendData('self-pub.');\n }\n else{\n publisherPart = publisherPart.appendData(publisherLocationString);\n }\n\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n\n publisherPart = publisherPart.parenthesis();\n firstInfo = firstInfo.appendData(publisherPart, ', ');\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n // let articleNumber = shared.getStringValue(refData.articleNumber);\n // firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title).shortenName();\n\n if (subsequentAuthorPart.length > 0) {\n title = title.toLowerCase();\n }\n }\n else{\n title = title.replaceAmpersand().shortenName().toTitleCase().italicize();\n }\n\n subsequentInfo = subsequentInfo.appendData(title, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n // let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n // referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: titlePart,\n authorPartNoLabel: String(titlePart),\n authorPartSort: String(titlePart),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n title = title.replaceAmpersand().toTitleCase(); \n }\n\n titlePart = titlePart.appendData(title);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let parties = shared.getStringValue(refData.parties);\n publicationPart = publicationPart.appendData(parties);\n publicationPart = publicationPart.addClosure();\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate);\n \n if (publicationDate == 'n.d.') {\n publicationDate = 'N.d.';\n }\n \n publicationPart = publicationPart.appendData(publicationDate);\n \n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //source\n let source = shared.getStringValue(refData.source);\n\n if (source.length > 0) {\n source = source.italicize();\n locationPart = locationPart.appendData(source); \n }\n\n //location\n let location = shared.getStringValue(refData.location);\n locationPart = locationPart.appendData(location);\n locationPart = locationPart.addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'articleTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n // [title], [parties], [publicationDate], [source] [location], [citationLocation], [url].\n\n let title = shared.getStringValue(refData.title);\n\n if (title.startsWith('[')) {\n title = shared.removeDescriptionFromTitle(title);\n } else{\n title = title.replaceAmpersand().toTitleCase(); \n }\n\n firstInfo = firstInfo.appendData(title, \", \");\n\n let parties = shared.getStringValue(refData.parties);\n firstInfo = firstInfo.appendData(parties, ', ');\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n firstInfo = firstInfo.appendData(publicationDate, ', ');\n\n //source\n let source = shared.getStringValue(refData.source);\n\n if (source.length > 0) {\n source = source.italicize();\n firstInfo = firstInfo.appendData(source, ', '); \n }\n\n //location\n let location = shared.getStringValue(refData.location);\n firstInfo = firstInfo.appendData(location);\n\n // url\n let url = shared.getStringValue(refData.url);\n\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n \n //[title], [citationLocation].\n subsequentInfo = subsequentInfo.appendData(title, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n \n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let type = shared.getStringValue(refData.type);\n\n let workTitle = shared.getStringValue(refData.title).replaceAmpersand();\n workTitle = workTitle.italicize(); \n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n if(type !== 'appealed'){\n let volume = shared.getStringValue(refData.volume);\n titlePart = titlePart.appendData(volume);\n }\n \n // get fields here to use in the switch below\n let pageNumber = shared.getStringValue(refData.pageNumber);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url);\n }\n\n let series = shared.getStringValue(refData.series);\n let seriesAbbreviation = getSeriesAbbreviation(series);\n\n let circuit = shared.getStringValue(refData.circuit);\n\n switch(type){\n case 'appealed':\n let appealVolume = shared.getStringValue(refData.appealVolume);\n let appealSeries = shared.getStringValue(refData.appealSeries);\n let appealAbbreviation = getSeriesAbbreviation(appealSeries);\n let appealPageNumber = shared.getStringValue(refData.appealPageNumber);\n let appealCircuit = shared.getStringValue(refData.appealCircuit);\n let appealDate = shared.getStringValue(refData.appealDate);\n appealDate = shared.getFullDate(appealDate); \n\n let appealCircuitPart = '';\n appealCircuitPart = appealCircuitPart.appendData(appealCircuit, ' ', '', 'Cir.');\n appealCircuitPart = appealCircuitPart.appendData(appealDate);\n appealCircuitPart = appealCircuitPart.parenthesis();\n\n titlePart = titlePart.appendData(appealVolume);\n titlePart = titlePart.appendData(appealAbbreviation, ' ', 'F.');\n titlePart = titlePart.appendData(appealPageNumber);\n \n titlePart = titlePart.appendData(appealCircuitPart);\n break;\n\n case 'circuit':\n titlePart = titlePart.appendData(seriesAbbreviation, ' ', 'F.');\n titlePart = titlePart.appendData(pageNumber, ' ');\n\n let circuitPart = '';\n circuitPart = circuitPart.appendData();\n circuitPart = circuitPart.appendData(circuit, ' ', '', 'Cir.');\n circuitPart = circuitPart.appendData(publicationDate);\n\n circuitPart = circuitPart.parenthesis()\n titlePart = titlePart.appendData(circuitPart, ' ');\n break;\n\n case 'district':\n titlePart = titlePart.appendData(seriesAbbreviation, ' ', 'F. Supp.');\n titlePart = titlePart.appendData(pageNumber, ' ');\n\n let districtPart = '';\n let district = shared.getStringValue(refData.district);\n districtPart = districtPart.appendData(district, ' ');\n districtPart = districtPart.appendData(publicationDate);\n districtPart = districtPart.parenthesis();\n\n titlePart = titlePart.appendData(districtPart, ' ');\n break;\n\n case 'supreme':\n titlePart = titlePart.appendData('US');\n titlePart = titlePart.appendData(pageNumber);\n titlePart = titlePart.appendData(publicationDate.parenthesis());\n break;\n }\n\n titlePart = titlePart.appendData(url, ', ');\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\n\nfunction getCitationTitle(refData){\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let type = shared.getStringValue(refData.type);\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let workTitle = shared.getStringValue(refData.title).replaceAmpersand();\n workTitle = workTitle.italicize(); \n firstInfo = firstInfo.appendData(workTitle, ', ');\n \n if(type !== 'appealed'){\n let volume = shared.getStringValue(refData.volume);\n firstInfo = firstInfo.appendData(volume, ', ');\n }\n\n // get fields here to use in the switch below\n let pageNumber = shared.getStringValue(refData.pageNumber);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url);\n }\n\n let series = shared.getStringValue(refData.series);\n let seriesAbbreviation = getSeriesAbbreviation(series);\n\n let circuit = shared.getStringValue(refData.circuit);\n\n switch(type){\n case 'appealed':\n let appealVolume = shared.getStringValue(refData.appealVolume);\n let appealSeries = shared.getStringValue(refData.appealSeries);\n let appealAbbreviation = getSeriesAbbreviation(appealSeries);\n let appealPageNumber = shared.getStringValue(refData.appealPageNumber);\n let appealCircuit = shared.getStringValue(refData.appealCircuit);\n let appealDate = shared.getStringValue(refData.appealDate);\n appealDate = shared.getFullDate(appealDate); \n\n let appealCircuitPart = '';\n appealCircuitPart = appealCircuitPart.appendData(appealCircuit, ' ', '', 'Cir.');\n appealCircuitPart = appealCircuitPart.appendData(appealDate);\n appealCircuitPart = appealCircuitPart.parenthesis();\n\n firstInfo = firstInfo.appendData(appealVolume, ', ');\n firstInfo = firstInfo.appendData(appealAbbreviation, ' ', 'F.');\n firstInfo = firstInfo.appendData(appealPageNumber);\n \n firstInfo = firstInfo.appendData(appealCircuitPart);\n break;\n\n case 'circuit':\n firstInfo = firstInfo.appendData(seriesAbbreviation, ' ', 'F.');\n firstInfo = firstInfo.appendData(pageNumber, ' ');\n\n let circuitPart = '';\n circuitPart = circuitPart.appendData();\n circuitPart = circuitPart.appendData(circuit, ' ', '', 'Cir.');\n circuitPart = circuitPart.appendData(publicationDate);\n\n circuitPart = circuitPart.parenthesis()\n firstInfo = firstInfo.appendData(circuitPart, ' ');\n break;\n\n case 'district':\n firstInfo = firstInfo.appendData(seriesAbbreviation, ' ', 'F. Supp.');\n firstInfo = firstInfo.appendData(pageNumber, ' ');\n\n let districtPart = '';\n let district = shared.getStringValue(refData.district);\n districtPart = districtPart.appendData(district, ' ');\n districtPart = districtPart.appendData(publicationDate);\n districtPart = districtPart.parenthesis();\n\n firstInfo = firstInfo.appendData(districtPart, ' ');\n break;\n\n case 'supreme':\n firstInfo = firstInfo.appendData('US');\n firstInfo = firstInfo.appendData(pageNumber);\n\n firstInfo = firstInfo.appendData(publicationDate.parenthesis());\n break;\n }\n\n firstInfo = firstInfo.appendData(url, ', ');\n firstInfo = firstInfo.addClosure();\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}\n\n\nfunction getSeriesAbbreviation(series){\n let abbreviation = '';\n\n switch (series) {\n case 'second':\n abbreviation = '2d'\n break;\n case 'third':\n abbreviation = '3d'\n break;\n case 'fourth':\n abbreviation = '4th'\n break;\n }\n\n return abbreviation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n\n //werid fix for empty date issue\n if (titlePart.endsWith('.') && locationPart.startsWith('(')) {\n titlePart = titlePart.removeLastCharacter();\n }\n\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let workTitle = shared.getStringValue(refData.title);\n workTitle = workTitle.replaceAmpersand().italicize(); \n titlePart = titlePart.appendData(workTitle);\n titlePart = titlePart.addClosure();\n\n let citations = getCitationString(refData.citation);\n titlePart = titlePart.appendData(citations);\n\n return titlePart;\n}\n\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n let courtPublicationDatePart = '';\n\n let court = shared.getStringValue(refData.court);\n courtPublicationDatePart = courtPublicationDatePart.appendData(court);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n // if(publicationDate === 'n.d.'){\n // courtPublicationDatePart = courtPublicationDatePart.appendData('N.d.');\n // } else {\n courtPublicationDatePart = courtPublicationDatePart.appendData(publicationDate);\n // }\n \n courtPublicationDatePart = courtPublicationDatePart.parenthesis();\n\n locationPart = locationPart.appendData(courtPublicationDatePart);\n\n // url\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url);\n locationPart = locationPart.appendData(url, ', ');\n }\n locationPart = locationPart.addClosure();\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.title).replaceAmpersand();\n\n if (citationTitle.startsWith('[')) {\n citationTitle = shared.removeDescriptionFromTitle(citationTitle);\n }\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n let workTitle = shared.getStringValue(refData.title);\n workTitle = workTitle.replaceAmpersand().italicize(); \n firstInfo = firstInfo.appendData(workTitle, ', ');\n\n let citations = getCitationString(refData.citation);\n firstInfo = firstInfo.appendData(citations, ', ');\n\n let courtPublicationDatePart = '';\n\n let court = shared.getStringValue(refData.court);\n courtPublicationDatePart = courtPublicationDatePart.appendData(court);\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n courtPublicationDatePart = courtPublicationDatePart.appendData(publicationDate);\n courtPublicationDatePart = courtPublicationDatePart.parenthesis();\n firstInfo = firstInfo.appendData(courtPublicationDatePart, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n\n let url = shared.getStringValue(refData.url);\n if (url.length > 0) {\n url = shared.formatURL(url);\n firstInfo = firstInfo.appendData(url, ', ');\n }\n \n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n\n workTitle = shared.getStringValue(refData.title);\n workTitle = workTitle.replaceAmpersand().italicize();\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}\n\n\nfunction getCitationString(citations){\n let citationString = '';\n\n if (typeof citations === 'undefined') {\n return citationString;\n }\n \n _forEach(citations, (citationData, index)=>{\n let volume = shared.getStringValue(citationData.volume);\n if (volume.length > 0) {\n citationString = citationString.appendData(volume);\n }\n\n let series = shared.getStringValue(citationData.series);\n if (series.length > 0) {\n // series = seriesAbbreviationToFull(series);\n citationString = citationString.appendData(series);\n }\n\n let pageNumber = shared.getStringValue(citationData.pageNumber);\n if (pageNumber.length > 0) {\n pageNumber = shared.formatPageNumbers(pageNumber, false);\n citationString = citationString.appendData(pageNumber);\n }\n\n // add a comma between multiple citations\n if(citations.length > 1 && index !== citations.length - 1){\n citationString = citationString + ',';\n }\n \n });//e:forEach\n\n return citationString;\n}//e:getCitationString\n\n\n// function seriesAbbreviationToFull(abbreviation){\n// //APA is entered in abbreviations...if they entered and abbreviation...convert it\n\n// let word = '';\n\n// var conversions = [\n// ['A.', 'Atlantic Reporter'],\n// ['A.2d', 'Atlantic Reporter, Second Series'],\n// ['Cal. Rptr.', 'California Reporter'],\n// ['Cal. Rptr. 2d', 'California Reporter, Second Series'],\n// ['N.Y.S.', 'New York Supplement'],\n// ['N.Y.S.2d', 'New York Supplement, Second Series'],\n// ['N.E.', 'North Eastern Reporter'],\n// ['N.E.2d', 'North Eastern Reporter, Second Series'],\n// ['N.W.', 'North Western Reporter'],\n// ['N.W.2d', 'North Western Reporter, Second Series'],\n// ['P.', 'Pacific Reporter'],\n// ['P.2d', 'Pacific Reporter, Second Series'],\n// ['P.3d', 'Pacific Reporter, Third Series'],\n// ['S.E.', 'South Eastern Reporter'],\n// ['S.E.2d', 'South Eastern Reporter, Second Series'],\n// ['So.', 'Southern Reporter'],\n// ['So.2d', 'Southern Reporter, Second Series'],\n// ['S.W.', 'South Western Reporter'],\n// ['S.W.2d', 'South Western Reporter, Second Series'],\n// ['S.W. 3d', 'South Western Reporter, Third Series']\n// ];\n\n// for (let index = 0; index < conversions.length; index++) {\n// let thisConversion = conversions[index][0];\n\n// if (thisConversion.toLowerCase() == abbreviation.toLowerCase()) {\n// word = conversions[index][1];\n// }\n// } \n\n// if (word == '') {\n// //if we havent converted yet, just leave it as is\n// word = abbreviation;\n// }\n\n// return word;\n// } //e:seriesAbbreviationToFull","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\nconst _forEach = require('lodash/forEach');\n\nlet useDescriptionForTitle = false; // set as a flag here so i can not include the descritpion later\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n \n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, true, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n \n // use description if there isn't a title\n let workTitle = shared.getStringValue(refData.title);\n\n if (workTitle) {\n // work title has content\n useDescriptionForTitle = false;\n \n // if this is a description, remove the brackets\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n } else{\n workTitle = workTitle.replaceAmpersand().toTitleCase().doubleQuote();\n }\n \n } else {\n // work title is blank, try to grab the description\n workTitle = shared.getStringValue(refData.description);\n if (workTitle) {\n useDescriptionForTitle = true;\n workTitle = workTitle.addClosure();\n } else {\n useDescriptionForTitle = false;\n }\n }\n\n titlePart = titlePart.appendData(workTitle); // %Rh - i can't test 19 - \"How Do Geckos Walk on Water?,\" to turn into \"How Do Geckos Walk on Water?\"\n titlePart = titlePart.addClosure();\n\n let secondaryContributors = shared.getSecondaryContributorString(refData).addClosure();\n titlePart = titlePart.appendData(secondaryContributors);\n titlePart = titlePart.addClosure();\n\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n seriesTitle = seriesTitle.replaceAmpersand().toTitleCase();\n titlePart = titlePart.appendData(seriesTitle);\n titlePart = titlePart.addClosure();\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let isPublisherAndAuthorSame = shared.isPublisherAndAuthorSame(refData);\n\n let publicationPart = '';\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n publicationDate = shared.getFullDate(publicationDate); \n\n let publisherString = shared.getPublisherString(refData.publishers, 'reference', false, false);\n\n if (refData.type === 'webinar') {\n\n let preText = '';\n if (publicationDate != 'n.d.') {\n preText = 'Recorded';\n }\n\n publicationPart = publicationPart.appendData(publicationDate, ' ', preText);\n\n if(!isPublisherAndAuthorSame){\n publicationPart = publicationPart.addClosure();\n\n if (preText.length > 0) {\n publicationPart = publicationPart.appendData('webinar', ' ', publisherString);\n }\n else{\n publicationPart = publicationPart.appendData('Webinar', ' ', publisherString);\n }\n \n }\n } else {\n if (refData.kind === 'hosted' && !isPublisherAndAuthorSame) {\n publicationPart = publicationPart.appendData(publisherString);\n publicationPart = publicationPart.addClosure();\n }\n\n publicationPart = publicationPart.appendData(publicationDate);\n publicationPart = publicationPart.addClosure();\n }\n\n let workTitle = shared.getStringValue(refData.title);\n\n if(!useDescriptionForTitle && !workTitle.startsWith('[')){\n // the description was not used for the title, so you can include it here\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n description = description.upperFirstLetter();\n publicationPart = publicationPart.appendData(description);\n }\n\n let runtime = shared.parseTimeStampString(refData.runtime);\n \n if (publicationPart.endsWith('.')) {\n publicationPart = publicationPart.appendData(runtime);\n }\n else{\n publicationPart = publicationPart.appendData(runtime, ', ');\n }\n\n publicationPart = publicationPart.addClosure();\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n //format\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatString(format);\n locationPart = locationPart.appendData(format).addClosure();\n\n // doi/url\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n locationPart = locationPart.appendData(doi);\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n }\n }\n\n return locationPart;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.workTitle).replaceAmpersand();\n\n return citationTitle;\n}\n\nfunction getCitation(refData, citationData) {\n\n let titleProperty = 'title';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty);\n firstInfo = firstInfo.appendData(authorPart);\n\n // use description if there isn't a title\n let workTitle = shared.getStringValue(refData.title);\n let descriptionAsTitle = false;\n\n if (workTitle) {\n // work title has content\n // if this is a description, remove the brackets\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle);\n // workTitle = workTitle.addClosure();\n descriptionAsTitle = true;\n } else{\n // workTitle = workTitle.toTitleCase() + ',';\n workTitle = workTitle.replaceAmpersand().toTitleCase();\n workTitle = workTitle.doubleQuote();\n \n }\n } else {\n // work title is blank, try to grab the description\n workTitle = shared.getStringValue(refData.description);\n if (workTitle) {\n // workTitle = workTitle.addClosure();\n descriptionAsTitle = true;\n }\n }\n\n firstInfo = firstInfo.appendData(workTitle, \", \");\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n firstInfo = firstInfo.appendData(secondaryContributors, \", \");\n\n let seriesTitle = shared.getStringValue(refData.seriesTitle);\n workTitle = workTitle.replaceAmpersand().toTitleCase();\n firstInfo = firstInfo.appendData(seriesTitle, \", \");\n \n let publicationDate = shared.getFullDate(refData.publicationDate);\n\n let isPublisherAndAuthorSame = shared.isPublisherAndAuthorSame(refData);\n\n let publisherPart = '';\n\n let publisherString = shared.getPublisherString(refData.publishers, 'reference', false, false);\n\n if (refData.type === 'webinar') {\n\n let preText = '';\n if (publicationDate != 'n.d.') {\n preText = 'recorded';\n }\n\n publisherPart = publisherPart.appendData(publicationDate, '', preText);\n \n if(!isPublisherAndAuthorSame && publisherString.length > 0){\n publisherPart = publisherPart.appendData(publisherString, ', ', '', 'webinar');\n }\n else{\n publisherPart = publisherPart.appendData('webinar', ', ');\n }\n } else {\n if (refData.kind === 'hosted' && !isPublisherAndAuthorSame) {\n let publisherLocationString = shared.getPublisherString(refData.publishers, 'reference', true, false);\n publisherPart = publisherPart.appendData(publisherLocationString);\n }\n publisherPart = publisherPart.appendData(publicationDate, ', ');\n }\n \n firstInfo = firstInfo.appendData(publisherPart, \", \", '', '', true);\n \n \n if(!useDescriptionForTitle && !descriptionAsTitle){\n // the description was not used for the title, so you can include it here\n let description = shared.getStringValue(refData.description);\n description = shared.replaceWithAbbreviations(description);\n description = description.toLowerCase();\n firstInfo = firstInfo.appendData(description, ', ');\n }\n\n let format = shared.getStringValue(refData.format);\n format = shared.fixFormatStringForCitation(format);\n firstInfo = firstInfo.appendData(format, ', ');\n\n let citationLocation = shared.getCitationLocationString(citationData, false);\n citationLocation = shared.parseTimeStampString(citationLocation);\n firstInfo = firstInfo.appendData(citationLocation, ', ');\n\n let articleNumber = shared.getStringValue(refData.articleNumber);\n firstInfo = firstInfo.appendData(articleNumber, ', ');\n\n if (firstInfo.endsWith(':')) {\n firstInfo = firstInfo.removeLastCharacter();\n }\n\n let url = shared.getStringValue(refData.url);\n let doi = shared.getStringValue(refData.doi);\n\n if (doi.length > 0) {\n doi = shared.appendDOIURL(doi).addClosure();\n firstInfo= firstInfo.appendData(doi, ', ');\n }\n else{\n if (url.length > 0) {\n url = shared.formatURL(url).addClosure();\n firstInfo = firstInfo.appendData(url, ', ');\n }\n }\n\n //Authora et al., \\\"Title,\\\" 4.\n //Contributors, \"articleTitle\", citationLocation\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true);\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n \n // use description if there isn't a title \n workTitle = shared.getStringValue(refData.title);\n\n if (workTitle) {\n // work title has content\n // if this is a description, remove the brackets\n if (workTitle.startsWith('[')) {\n workTitle = shared.removeDescriptionFromTitle(workTitle).shortenName();\n workTitle = workTitle.addClosure();\n } else{\n workTitle = workTitle.replaceAmpersand().shortenName().toTitleCase().doubleQuote();\n \n }\n } else {\n // work title is blank, try to grab the description\n workTitle = shared.getStringValue(refData.description);\n if (workTitle) {\n workTitle = workTitle.shortenName().addClosure();\n }\n }\n\n subsequentInfo = subsequentInfo.appendData(workTitle, ', ');\n subsequentInfo = subsequentInfo.appendData(citationLocation, ', ');\n\n let citation = {\n first : firstInfo.addClosure().toString(),\n subsequent : subsequentInfo.addClosure().toString()\n }\n\n return citation;\n}","const shared = require('./Turabian9-Shared.js');\nconst stringHelper = require('../stringHelper.js');\n\nmodule.exports = {\n getReference,\n getCitation\n}\n\nfunction getReference(refData) {\n \n let referenceValue = '';\n\n let authorPart = shared.getAuthorPart(refData, false);\n let titlePart = getTitlePart(refData);\n let publicationPart = getPublicationPart(refData);\n let locationPart = getLocationPart(refData);\n \n referenceValue = referenceValue.appendData(authorPart);\n referenceValue = referenceValue.appendData(titlePart);\n referenceValue = referenceValue.appendData(publicationPart);\n referenceValue = referenceValue.appendData(locationPart);\n\n let citationTitle = getCitationTitle(refData);\n let citationShortTitle = citationTitle.shortenName();\n\n let reference = {\n authorPart: String(authorPart),\n authorPartNoLabel: String(shared.getAuthorPart(refData, false, true)),\n authorPartSort: String(shared.getAuthorPartSort(refData, false)),\n citationTitle: getCitationTitle(refData),\n citationShortTitle: citationShortTitle,\n citationDefaultShortTitle: citationShortTitle,\n value: referenceValue.trim(),\n isPrintedOnReferencePage: true\n }\n\n return reference;\n}\n\nfunction getCitation(refData, citationData) {\n\n //define our citation logic for this type here\n let titleProperty = 'pageTitle';\n let firstInfo = '';\n let subsequentInfo = '';\n\n let authorPart = shared.getCitationAuthorPart(refData, titleProperty, false, true);\n let titlePart = getCitationTitlePart(refData);\n let publicationPart = getCitationPublicationPart(refData);\n let locationPart = getCitationLocationPart(refData);\n\n firstInfo = firstInfo.appendData(authorPart);\n firstInfo = firstInfo.appendData(titlePart, \", \");\n firstInfo = firstInfo.appendData(publicationPart, \", \");\n firstInfo = firstInfo.appendData(locationPart, \", \");\n\n let subsequentAuthorPart = shared.getCitationAuthorPart(refData, titleProperty, true, true);\n let subsequentTitlePart = getSubsequentCitationTitlePart(refData);\n\n subsequentInfo = subsequentInfo.appendData(subsequentAuthorPart);\n subsequentInfo = subsequentInfo.appendData(subsequentTitlePart, \", \");\n\n let citation = shared.getCitations(citationData, firstInfo, subsequentInfo, refData);\n\n return citation;\n}\n\nfunction getCitationTitle(refData){\n\n let citationTitle = '';\n\n citationTitle = shared.getStringValue(refData.citationTitle).replaceAmpersand();\n \n return citationTitle;\n}\n\nfunction getTitlePart(refData){\n let titlePart = '';\n\n let pageTitle = shared.getStringValue(refData.pageTitle);\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n if (pageTitle.startsWith('[')) {\n pageTitle = shared.removeDescriptionFromTitle(pageTitle);\n }\n\n //If the work contains a pageTitle and a translatedTitle, then both titles are NOT title cased - they are left in sentence case.\n if (pageTitle.length > 0 && translatedTitle.length > 0) {\n // pagetitle = pageTitle.doubleQuote().addClosure();\n pageTitle = pageTitle.doubleQuote();\n\n translatedTitle = translatedTitle.bracket().addClosure();\n }\n else{\n pageTitle = pageTitle.replaceAmpersand();\n pageTitle = pageTitle.toTitleCase().doubleQuote().addClosure();\n translatedTitle = translatedTitle.bracket().addClosure();\n }\n\n\n titlePart = titlePart.appendData(pageTitle);\n titlePart = titlePart.appendData(translatedTitle);\n\n if (titlePart.length == 0) {\n let websiteTitle = shared.getStringValue(refData.websiteTitle);\n\n if (websiteTitle.length > 0) {\n titlePart = websiteTitle.doubleQuote().addClosure();\n }\n }\n\n return titlePart;\n}\n\nfunction getPublicationPart(refData){\n let publicationPart = '';\n\n let secondaryContributors = shared.getSecondaryContributorString(refData);\n secondaryContributors = secondaryContributors.addClosure();\n publicationPart = publicationPart.appendData(secondaryContributors);\n\n let websiteTitle = shared.getStringValue(refData.websiteTitle);\n websiteTitle = websiteTitle.addClosure();\n\n let authorPart = shared.getAuthorPart(refData);\n let titlePart = getTitlePart(refData);\n\n if (authorPart.replaceAll(\"’\", \"'\") != websiteTitle.replaceAll(\"’\", \"'\") && titlePart != websiteTitle.doubleQuote()) {\n publicationPart = publicationPart.appendData(websiteTitle);\n }\n\n //group authors are treated as a publisher here...if they are not the only authors\n let groupAuthors = shared.getGroupAuthorCitationString(refData.contributors);\n\n if (groupAuthors.length > 0) {\n if (websiteTitle != groupAuthors && groupAuthors.addClosure() != authorPart) {\n groupAuthors = groupAuthors.addClosure();\n publicationPart = publicationPart.appendData(groupAuthors);\n }\n }\n\n // let publicationDate = shared.getStringValue(refData.publicationDate);\n // publicationDate = shared.getFullDate(publicationDate).addClosure();\n \n\n // if (publicationDate = 'n.d.') {\n // let retrievalDate = shared.getStringValue(refData.retrievalDate);\n // retrievalDate = shared.getFullDate(retrievalDate).addClosure();\n // publicationPart = publicationPart.appendData(retrievalDate, ' ', 'Accessed');\n // }\n // else{\n // publicationPart = publicationPart.appendData(publicationDate);\n // }\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n\n if (publicationDate.length == 0 && retrievalDate.length > 0) {\n retrievalDate = shared.getFullDate(retrievalDate).addClosure();\n publicationPart = publicationPart.appendData(retrievalDate, ' ', 'Accessed', '');\n }\n else{\n publicationDate = shared.getFullDate(publicationDate).addClosure();\n publicationPart = publicationPart.appendData(publicationDate, \" \");\n }\n\n return publicationPart;\n}\n\nfunction getLocationPart(refData){\n let locationPart = '';\n\n let url = shared.getStringValue(refData.url);\n url = shared.formatURL(url).addClosure();\n locationPart = locationPart.appendData(url);\n\n return locationPart;\n}\n\nfunction getCitationTitlePart(refData){\n let titlePart = '';\n\n let pageTitle = shared.getStringValue(refData.pageTitle);\n \n if (pageTitle.startsWith('[')) {\n pageTitle = shared.removeDescriptionFromTitle(pageTitle);\n }\n\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n //If the work contains a pageTitle and a translatedTitle, then both titles are NOT title cased - they are left in sentence case.\n if (pageTitle.length > 0 && translatedTitle.length > 0) {\n pagetitle = pageTitle.doubleQuote();\n translatedTitle = translatedTitle.bracket();\n }\n else{\n pageTitle = pageTitle.replaceAmpersand();\n pagetitle = pageTitle.toTitleCase().doubleQuote();\n translatedTitle = translatedTitle.bracket();\n }\n \n titlePart = titlePart.appendData(pagetitle);\n titlePart = titlePart.appendData(translatedTitle);\n\n return titlePart;\n}\n\nfunction getCitationPublicationPart(refData){\n let publicationPart = '';\n\n let secondaryContributors = shared.getSecondaryContributorCitationString(refData);\n publicationPart = publicationPart.appendData(secondaryContributors, \", \");\n\n let titlePart = getCitationTitlePart(refData);\n\n let websiteTitle = shared.getStringValue(refData.websiteTitle);\n\n if (titlePart.length == 0 && publicationPart.length == 0) {\n websiteTitle = websiteTitle.doubleQuote();\n }\n\n publicationPart = publicationPart.appendData(websiteTitle.replaceAll(\"’\", \"'\"), \", \");\n\n //group authors are treated as a publisher here\n let groupAuthors = shared.getGroupAuthorCitationString(refData.contributors);\n\n if (websiteTitle.replaceAll(\"’\", \"'\") != groupAuthors.replaceAll(\"’\", \"'\")) {\n publicationPart = publicationPart.appendData(groupAuthors, \", \");\n }\n\n let publicationDate = shared.getStringValue(refData.publicationDate);\n let retrievalDate = shared.getStringValue(refData.retrievalDate);\n\n if (publicationDate.length == 0 && retrievalDate.length > 0) {\n retrievalDate = shared.getFullDate(retrievalDate);\n publicationPart = publicationPart.appendData(retrievalDate, ', ', 'accessed', '');\n }\n else{\n publicationDate = shared.getFullDate(publicationDate);\n publicationPart = publicationPart.appendData(publicationDate, \", \");\n }\n\n return publicationPart;\n}\n\nfunction getCitationLocationPart(refData){\n let locationPart = '';\n\n let url = shared.getStringValue(refData.url);\n url = shared.formatURL(url);\n locationPart = locationPart.appendData(url);\n\n return locationPart;\n}\n\nfunction getSubsequentCitationTitlePart(refData){\n let titlePart = '';\n\n let pageTitle = shared.getStringValue(refData.pageTitle);\n let translatedTitle = shared.getStringValue(refData.translatedTitle);\n\n //If the work contains a pageTitle and a translatedTitle, then both titles are NOT title cased - they are left in sentence case.\n if (pageTitle.length > 0 && translatedTitle.length > 0) {\n pagetitle = pageTitle.shortenName().doubleQuote();\n }\n else{\n pageTitle = pageTitle.replaceAmpersand();\n pagetitle = pageTitle.shortenName().toTitleCase().doubleQuote();\n }\n\n titlePart = titlePart.appendData(pagetitle);\n\n if (titlePart.length == 0) {\n let websiteTitle = shared.getStringValue(refData.websiteTitle);\n\n titlePart = websiteTitle.shortenName().doubleQuote();\n }\n\n return titlePart;\n}","/*\n- DateHelper\n-- inpired from: https://stevenlevithan.com/assets/misc/date.format.js\n-- 2023.09.20\n*/\n\nfunction format(dateObj, formatRequested){\n\tconst regEx = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\\1?|[LloSZ]|\"[^\"]*\"|'[^']*'/g;\n\tlet pad = function (val, len) {\n\t\tval = String(val);\n\t\tlen = len || 2;\n\t\twhile (val.length < len) val = \"0\" + val;\n\t\t\treturn val;\n\t};\n\t\t\n\t// Passing date through Date applies Date.parse, if necessary\n\tdateObj = dateObj ? new Date(dateObj) : new Date;\n\t\n\t// if (isNaN(dateObj)) throw SyntaxError(\"invalid date\");\n\t// rollbar logs these and doesn't need to - to replicate select a full date then manually delete the month entry\n\tif(isNaN(dateObj)){\n\t\treturn '';\n\t}\n\n\tlet i18n = {\n\t\tdayNames: [\n\t\t\t\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\",\n\t\t\t\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"\n\t\t],\n\t\tmonthNames: [\n\t\t\t\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\",\n\t\t\t\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n\t\t]\n\t};\n\n\tlet formats = {\n\t\td: dateObj.getDate(),\n\t\tdd: pad(dateObj.getDate()),\n\t\tddd: i18n.dayNames[dateObj.getDay()],\n\t\tdddd: i18n.dayNames[dateObj.getDay() + 7],\n\t\tm: dateObj.getMonth() + 1,\n\t\tmm: pad(dateObj.getMonth() + 1),\n\t\tmmm: i18n.monthNames[dateObj.getMonth()],\n\t\tmmmm: i18n.monthNames[dateObj.getMonth() + 12],\n\t\tyy: String(dateObj.getFullYear()).slice(2),\n\t\tyyyy: dateObj.getFullYear()\n\t};\n\n\treturn formatRequested.replace(regEx, function ($0) {\n\t\treturn $0 in formats ? formats[$0] : $0.slice(1, $0.length - 1);\n\t});\n}\n\nmodule.exports = {\n format\n}","String.prototype.bracket = function() {\n if (this.length == 0) {\n return this;\n }\n\n return '[' + this + ']';\n}\n\nString.prototype.removeBrackets = function() {\n if (this.length == 0) {\n return this;\n }\n\n let text = this.trim();\n\n if (text.startsWith('[')) {\n text = text.slice(1);\n\n //remove the ending bracket too\n if (text.endsWith(']')) {\n text = text.slice(0, -1);\n }\n }\n\n return text;\n}\n\nString.prototype.parenthesis = function() {\n if (this.length == 0) {\n return this;\n }\n\n return '(' + this + ')';\n}\n\nString.prototype.trimSubtitle = function() {\n //pull out any odd characters\n let trimmed = this.trim();\n\n //if this is a subtitle, out an extra spacing before or after\n if (trimmed.includes(':')) {\n let subtitleArray = trimmed.split(':');\n\n if (subtitleArray.length == 2) {\n trimmed = subtitleArray[0].trim() + ': ' + subtitleArray[1].trimStart();\n }\n }\n\n return trimmed;\n}\n\nString.prototype.italicize = function() {\n if (this.length == 0) {\n return '';\n }\n\n //helper to just wrap the string in italics\n return '' + this + '';\n}\n\nString.prototype.getInitial = function() {\n //Contributor: If a first or midddle name is hyphenated and the name after the hyphen is capitalized, \n //keep the hyphenation and place a period after each capital letter\n \n //Ai-Jun Xu = Jun, A.-J.\n if (this.includes('-')) {\n var nameArray = this.split(\"-\");\n var secondPart = nameArray[1].trim();\n\n if (secondPart.charAt(0) == secondPart.charAt(0).toUpperCase()) {\n return nameArray[0].charAt(0) + '.-' + secondPart.charAt(0).toUpperCase() + '.';\n }\n }\n\n //if you get here, just return what was passed\n return this.trim().charAt(0).toUpperCase() + '.';\n}\n\nString.prototype.appendData = function(data, seperator, prefix, suffix, ignorePunctuation) {\n\n if (typeof prefix === 'undefined') {\n prefix = '';\n }\n\n if (typeof suffix === 'undefined') {\n suffix = '';\n }\n\n if (typeof seperator === 'undefined') {\n seperator = ' ';\n }\n\n if (typeof data === 'undefined') {\n data = '';\n }\n\n if (typeof ignorePunctuation === 'undefined') {\n ignorePunctuation = false;\n }\n\n if (prefix.length > 0) {\n prefix = prefix + ' ';\n }\n\n if (suffix.length > 0) {\n suffix = ' ' + suffix;\n }\n\n if (data.startsWith('(')) {\n seperator = ' ';\n }\n\n if (data.length == 0) {\n return this;\n }\n else{\n data = prefix + data + suffix;\n }\n\n if (this.length == 0) {\n return data;\n }\n\n //if the last character in the string is a double quote, move the comma inside\n if (seperator == \", \") {\n if (ignorePunctuation && this.endsWith('\\'\"')) {\n return this.slice(0, -2) + ',\\'\" ' + data;\n }\n \n if (ignorePunctuation && this.endsWith('\"')) {\n return this.slice(0, -1) + ',\" ' + data;\n } \n }\n \n if (seperator == \", \" && !ignorePunctuation) {\n \n if (this.endsWith('\"')) {\n\n if (!this.endsWith('?\"') && !this.endsWith('!\"')) {\n return this.slice(0, -1) + ',\" ' + data;\n }\n else{\n return this + ' ' + data;\n }\n }\n\n //if this has a punctuation, then a comma is not needed\n if (this.endsWith('!') || this.endsWith('!') ||\n this.endsWith('?') || this.endsWith('?')\n ){\n return this + ' ' + data;\n }\n }\n\n return this + seperator + data;\n}\n\nString.prototype.doubleQuote = function() {\n if (this.length == 0) {\n return this;\n }\n\n let newText = this;\n\n if (newText.includes('\"')) {\n newText = newText.replaceAll('\"', \"'\")\n }\n\n return '\"' + newText + '\"';\n}\n\nString.prototype.addClosure = function (){\n\n let text = this;\n \n if (text.length > 0) {\n if (!text.endsWith('.') && !text.endsWith('?') && !text.endsWith('!')\n && !text.endsWith('.') && !text.endsWith('?') && !text.endsWith('!')) {\n text = text + \".\";\n } \n\n //if text ends with the a title in double quotes, followed by a period, we need to move the period inside the quote\n if (text.endsWith('\\'\".')) {\n\n let title = text.slice(0, -3);\n let punctuation = '.\\'\"';\n\n text = title + punctuation;\n }\n \n if (text.endsWith('\".')) {\n\n let title = text.slice(0, -2);\n let punctuation = '.\"';\n\n if (title.endsWith('!') || title.endsWith('?') || title.endsWith('.')) {\n //if text is an ellipsis, it still needs an extra period\n if (!title.endsWith('...')) {\n punctuation = '\"';\n }\n }\n\n text = title + punctuation;\n }\n }\n\n return text;\n}\n\nString.prototype.toTitleCase = function() {\n\n //pull out any odd characters\n let trimmed = this.trim();\n\n if (trimmed == 0) {\n return trimmed;\n }\n\n //if this is a subtitle, out an extra spacing before or after\n if (trimmed.includes(':')) {\n let subtitleArray = trimmed.split(':');\n\n if (subtitleArray.length == 2) {\n trimmed = subtitleArray[0].trim() + ': ' + subtitleArray[1].trimStart();\n }\n }\n\n var sentence = trimmed.split(\" \");\n\n let lowers = ['A', 'An', 'The', 'And', 'But', 'Or', 'For', 'Nor', 'At', 'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With', 'Against', 'As', 'Between', 'Yet', 'So', 'According', 'De', 'En', 'Entre', 'Por', 'Para', 'Con', 'Ante', 'Bajo', 'Contra', 'Segùn', 'Lo'];\n\n let uppers = ['Id', 'Tv'];\n\n for(var i = 0; i< sentence.length; i++){\n\n let previousWord = '';\n\n if (i > 0) {\n previousWord = sentence[i - 1];\n }\n\n let thisWord = sentence[i];\n let thisWordToCheck = thisWord;\n let thisWordPrefix = '';\n\n //this is to handle title like this: Depression (Major Depressive Disorder)\n if (thisWord.startsWith('(') ||\n thisWord.startsWith('[') ||\n thisWord.startsWith('\"') ||\n thisWord.startsWith('\\'')) {\n \n thisWordPrefix = thisWord.substring(0,1);\n thisWordToCheck = thisWord.substring(1, thisWord.length);\n }\n\n if (i > 0) {\n //leave the lower case entries alone, unless they start a sentence\n let isLower = false;\n for (let index = 0; index < lowers.length; index++) {\n const element = lowers[index];\n \n //also ignore the lowers if this is the start of the subtitle\n if (element.toLowerCase() == thisWordToCheck.toLowerCase() \n && !previousWord.endsWith(':')) {\n sentence[i] = thisWordPrefix + thisWordToCheck[0].toLowerCase() + thisWordToCheck.slice(1);\n isLower = true;\n }\n }\n\n //if it's in the upper array, \n let isUpper = false;\n for (let index = 0; index < uppers.length; index++) {\n const element = uppers[index];\n \n if (element.toLowerCase() == thisWordToCheck.toLowerCase()) {\n sentence[i] = thisWordPrefix + thisWordToCheck.toUpperCase();\n isUpper = true;\n }\n }\n\n // //see if this is an abbreviation\n let isAbbreviation = false;\n // if (thisWordToCheck.includes(\".\")) {\n // sentence[i] = thisWordPrefix + thisWordToCheck.toUpperCase();\n // isAbbreviation = true;\n // }\n\n //see if the word contains a -\n let isHyphenated = false;\n if (thisWordToCheck.includes(\"-\")) {\n let hyphenArray = thisWordToCheck.split('-');\n\n sentence[i] = '';\n\n let thisWord = '';\n for (let index = 0; index < hyphenArray.length; index++) {\n if (index > 0) {\n sentence[i] = sentence[i] + '-';\n }\n\n thisWord = hyphenArray[index];\n\n //only upper case this if the word is not in the lowers array\n let leaveLower = false;\n for (let index = 0; index < lowers.length; index++) {\n const element = lowers[index];\n \n if (element.toLowerCase() == thisWord.toLowerCase()) {\n leaveLower = true;\n }\n }\n\n //make sure to not lower case the first word either\n if (leaveLower && index != 0) {\n\n if (typeof hyphenArray[index][0] !== 'undefined') {\n if (hyphenArray[index][0].length > 0) {\n thisWord = hyphenArray[index][0].toLowerCase();\n }\n }\n }\n else{\n if (typeof hyphenArray[index][0] !== 'undefined') {\n if (hyphenArray[index][0].length > 0) {\n thisWord = hyphenArray[index][0].toUpperCase();\n }\n }\n }\n\n sentence[i] = sentence[i] + thisWord + hyphenArray[index].slice(1);\n }\n\n sentence[i] = thisWordPrefix + sentence[i];\n\n isHyphenated = true;\n }\n\n if (!isLower && !isUpper && !isAbbreviation && !isHyphenated) {\n if (thisWordToCheck.length > 0) {\n sentence[i] = thisWordPrefix + thisWordToCheck[0].toUpperCase() + thisWordToCheck.slice(1); \n }\n }\n\n }\n else{\n\n if (thisWordToCheck.length > 0) {\n sentence[i] = thisWordPrefix + thisWordToCheck[0].toUpperCase() + thisWordToCheck.slice(1);\n }\n }\n }\n\n return sentence.join(\" \");\n}\n\nString.prototype.upperFirstLetter = function() {\n if (this.length == 0) {\n return this;\n }\n\n if (this.length == 1) {\n return this.toUpperCase();\n }\n\n return this.charAt(0).toUpperCase() + this.slice(1);\n}\n\nString.prototype.lowerFirstLetter = function() {\n if (this.length == 0) {\n return this;\n }\n\n if (this.length == 1) {\n return this.toLowerCase();\n }\n\n return this.charAt(0).toLowerCase() + this.slice(1);\n}\n\nString.prototype.removeLastCharacter = function() {\n if (this.length == 0) {\n return this;\n }\n\n return this.slice(0, -1);\n}\n\nString.prototype.ordinalToNumber = function() {\n if (this.length == 0) {\n return this;\n }\n\n //converts something like 4th to 4\n let string = parseInt(this);\n\n if (isNaN(string)) {\n //if the passed something like \"Evidence\" as the section - a name will convert to null\n return this;\n }\n else{\n return string;\n }\n}\n\nString.prototype.shortenName = function(isForeign){\n\n if (typeof isForeign === 'undefined') {\n isForeign = false;\n }\n\n if (this.length == 0) {\n return this;\n }\n\n let name = String(this);\n\n //add an addtional check to see if this is a url, and shorten to the domain only\n if (name.split(\" \").length == 1 && name.toLowerCase().startsWith('http')) {\n //hack to ignore //\n let domain = name.replace('//', 'PERRLA_SHORTEN');\n\n let parts = domain.split(\"/\");\n\n domain = parts[0].replace('PERRLA_SHORTEN', '//');\n\n return domain;\n }\n\n //if we contain preposition, cut before it\n //otherwise, 3 words...break\n\n let prepositions = ['aboard'\n ,'about'\n ,'above'\n ,'across'\n ,'after'\n ,'against'\n ,'along'\n ,'amid'\n ,'among'\n ,'anti'\n ,'around'\n ,'as'\n ,'at'\n ,'before'\n ,'behind'\n ,'below'\n ,'beneath'\n ,'beside'\n ,'besides'\n ,'between'\n ,'beyond'\n ,'but'\n ,'by'\n ,'concerning'\n ,'considering'\n ,'despite'\n ,'down'\n ,'during'\n ,'except'\n ,'excepting'\n ,'excluding'\n ,'following'\n ,'for'\n ,'from'\n ,'in'\n ,'inside'\n ,'into'\n ,'like'\n ,'minus'\n ,'near'\n ,'of'\n ,'off'\n ,'on'\n ,'onto'\n ,'opposite'\n ,'outside'\n ,'over'\n ,'past'\n ,'per'\n ,'plus'\n ,'regarding'\n ,'round'\n ,'save'\n ,'since'\n ,'than'\n ,'through'\n ,'to'\n ,'toward'\n ,'towards'\n ,'under'\n ,'underneath'\n ,'unlike'\n ,'until'\n ,'up'\n ,'upon'\n ,'versus'\n ,'via'\n ,'with'\n ,'within'\n ,'without','and', 'or', 'but', '&', 'how', 'do', 'that', 'is'\n ];\n\n if (isForeign) {\n prepositions.push('con');\n prepositions.push('de');\n prepositions.push('la');\n }\n\n //if this is a subtitle, only take the first entry before the :\n if (name.includes(':')) {\n let subtitleArray = name.split(':');\n name = subtitleArray[0].trim();\n }\n\n //same with: Depression (Major Depressive Disorder)\n if (name.includes('(')) {\n let subtitleArray = name.split('(');\n name = subtitleArray[0].trim();\n }\n \n let words = name.split(\" \");\n\n let shortName = '';\n let foundPrep = false;\n let foundNonPrep = false;\n let counter = 0;\n let startsWithDQuote = false;\n let endsWithDQuote = false;\n let startsWithSQuote = false;\n let endsWithSQuote = false;\n\n //do not stop once we \n words.forEach(word => {\n let isPrep = prepositions.includes(word.toLowerCase());\n\n //also treat any 2 letter or less words as preps\n if (!isPrep) {\n if (word.length < 3 && !word.isInteger()) {\n isPrep = true;\n }\n }\n\n // let isAbbreviated = isAbbreviation(word);\n let isAbbreviated = false;\n\n if (foundPrep) {\n if (!foundNonPrep) {\n //keep adding until we find a non-prep\n if (word.endsWith('\"')) {\n endsWithDQuote = true;\n }\n\n if (word.endsWith(\"'\")) {\n endsWithSQuote = true;\n }\n\n if (word.startsWith('\"')) {\n startsWithDQuote = true;\n\n if (!word.endsWith('\"')) {\n endsWithDQuote = false;\n }\n }\n\n if (word.startsWith(\"'\")) {\n startsWithSQuote = true;\n\n if (!word.endsWith(\"'\")) {\n endsWithSQuote = false;\n }\n }\n\n shortName = shortName.appendData(word, ' ');\n }\n }\n else{\n //have not found a prep and we are still less than 3, add it\n if (!foundNonPrep) {\n if (word.endsWith('\"')) {\n endsWithDQuote = true;\n }\n\n if (word.endsWith(\"'\")) {\n endsWithSQuote = true;\n }\n\n if (word.startsWith('\"')) {\n startsWithDQuote = true;\n\n if (!word.endsWith('\"')) {\n endsWithDQuote = false;\n }\n }\n\n if (word.startsWith(\"'\")) {\n startsWithSQuote = true;\n\n if (!word.endsWith(\"'\")) {\n endsWithSQuote = false;\n }\n }\n\n shortName = shortName.appendData(word, ' ');\n }\n else{\n if (counter < 3 && !isPrep) {\n\n if (word.endsWith('\"')) {\n endsWithDQuote = true;\n }\n\n if (word.endsWith(\"'\")) {\n endsWithSQuote = true;\n }\n \n if (word.startsWith('\"')) {\n startsWithDQuote = true;\n \n if (!word.endsWith('\"')) {\n endsWithDQuote = false;\n }\n }\n\n if (word.startsWith(\"'\")) {\n startsWithSQuote = true;\n \n if (!word.endsWith(\"'\")) {\n endsWithSQuote = false;\n }\n }\n\n shortName = shortName.appendData(word, ' ');\n }\n }\n }\n\n if (isPrep || isAbbreviated) {\n foundPrep = true;\n }\n else{\n foundNonPrep = true;\n }\n\n counter++;\n });\n\n shortName = shortName.trim();\n\n //if the shortened name ends in a comma, remove it\n if (shortName.endsWith(',')) {\n shortName = shortName.slice(0, -1);\n }\n\n //if we opened a quote, but didn't close it...we need to close it\n if (startsWithDQuote && !endsWithDQuote) {\n shortName = shortName + '\"';\n }\n\n if (startsWithSQuote && !endsWithSQuote) {\n shortName = shortName + \"'\";\n }\n\n return shortName;\n}\n\nString.prototype.getOrdinalValue = function(){\n\n if (this.length == 0) {\n return this;\n }\n\n //https://stackoverflow.com/questions/13627308/add-st-nd-rd-and-th-ordinal-suffix-to-a-number\n if (this.isInteger()) {\n var j = this % 10,\n k = this % 100;\n if (j == 1 && k != 11) {\n return this + \"st\";\n }\n if (j == 2 && k != 12) {\n return this + \"nd\";\n }\n if (j == 3 && k != 13) {\n return this + \"rd\";\n }\n return this + \"th\";\n }\n\n return this;\n}\n\nString.prototype.isInteger = function() {\n return !isNaN(this) && \n parseInt(Number(this)) == this && \n !isNaN(parseInt(this, 10));\n}\n\nString.prototype.getYear = function(){\n\n if (typeof this == 'undefined'){\n return '';\n }\n\n if (this.length == 0) {\n return this;\n }\n\n let date = this;\n var year = '';\n\n date = fixPageDash(date);\n\n //2018-2020 need to be abbrivated as 2018-20\n if (date.includes('–')) {\n var array = date.split(\"–\");\n\n if (array.length == 2) {\n\n //trim both entries\n array[0] = array[0].trim();\n array[1] = array[1].trim();\n\n //both 4 chars\n if (array[0].length == 4 && array[1].length == 4) {\n if (array[0].substring(0, 2) == array[1].substring(0, 2)) {\n year = array[0] + '-' + array[1].substring(2);\n return fixPageDash(year);\n }\n }\n }\n }\n\n //see if the format is either 2019 or 2/2/2019 or 2018/2020\n if (date.includes(\"/\")) {\n //split into an array and grab the last entry in that array\n var array = date.split(\"/\");\n\n if (array.length == 2) {\n //both 4 chars\n if (array[0].length == 4 && array[1].length == 4) {\n if (array[0].substring(0, 2) == array[1].substring(0, 2)) {\n year = array[0] + '-' + array[1].substring(2);\n return fixPageDash(year);\n }\n }\n }\n\n year = array[array.length-1]\n }\n else{\n if (date.length > 4) {\n\n //2018-2020\n if (date.includes(\"-\")) {\n year = date;\n }\n else {\n try {\n year = dateHelper.format(date, \"yyyy\");\n }\n catch(err) {\n console.log('Failed to convert year of ' + date);\n console.log(err);\n year = date;\n }\n }\n }\n else {\n //assume this is only a year\n year = date;\n }\n }\n\n return year;\n}\n\nString.prototype.customLowerCase = function(){\n\n //this is a customized version of lower case that will only lower case words that are not upper cased as entered\n let text = String(this);\n\n let words = text.split(\" \");\n let lowerText = \"\";\n\n words.forEach(word => {\n \n let isUpperCase = word === word.toUpperCase();\n\n if (isUpperCase) {\n lowerText = lowerText.appendData(word); \n }\n else{\n lowerText = lowerText.appendData(word.toLowerCase());\n }\n });\n\n return lowerText;\n}\n\n//https://stackoverflow.com/questions/7313395/case-insensitive-replace-all\nString.prototype.replaceAll = function(strReplace, strWith) {\n // See http://stackoverflow.com/a/3561711/556609\n var esc = strReplace.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n var reg = new RegExp(esc, 'ig');\n return this.replace(reg, strWith);\n};\n\nString.prototype.replaceAmpersand = function() {\n if (this.length == 0) {\n return '';\n }\n\n return this.replaceAll('&', 'and');\n}\n\nfunction fixPageDash(pages){\n \n let cleanPages = ''\n\n cleanPages = pages.replace('-', '–');\n cleanPages = cleanPages.replace(' - ', '–');\n cleanPages = cleanPages.replace(' – ', '–');\n\n return cleanPages;\n}","/*\n- Api\n-- Other than session id this one should only be for saving API level headers\n-- I can't decide how this is different from Customer\n-- ex: this.$store.state.api.x\n-- 2022.11.14\n*/\n\nexport default {\n\tnamespaced: true,\n\t\n\tstate: {\n\t\t// local storage states\n\t\tsessionId: '',\n\t\ttoken: '',\t// the word 'token' might be creating the problem on the Live Add-In so overname it here to check and see\n\n\t\t// non local storage states\n\t\tbrowserName: '',\n\t\tbrowserVersion: '',\n\t\tcustomerId: '',\n\t\tosName: '',\n\t\tosVersion:'',\n\t},\n\t\n\tmutations: {\n\t\tSET_BROWSER_NAME(state, value)\t{\n\t\t\tstate.browserName = value;\n\t\t},\n\t\tSET_BROWSER_VERSION(state, value)\t{\n\t\t\tstate.browserVersion = value;\n\t\t},\n\t\tSET_CUSTOMER_ID(state, value)\t{\n\t\t\tstate.customerId = value;\n\t\t},\n\t\tSET_OS_NAME(state, value)\t{\n\t\t\tstate.osName = value;\n\t\t},\n\t\tSET_OS_VERSION(state, value)\t{\n\t\t\tstate.osVersion = value;\n\t\t},\n\t\tSET_SESSION_ID(state, value)\t{\n\t\t\tstate.sessionId = value;\n\t\t},\n\t\tSET_TOKEN(state, value) {\n\t\t\tstate.token = value;\n\t\t},\n\t},\n}","/*\n- Cart\n-- ex: state.cart.x\n*/\nconst taxRateTN = 0.0975;\n\nimport _has from 'lodash/has';\nimport _isEmpty from 'lodash/isEmpty';\nimport ApiS_MakeCall from '@/services/app/api/makeCall';\nimport { addMonths } from 'date-fns';\nimport config from '@/config';\nimport dateFormat from \"dateformat\";\nimport router from '@/router';\n\nexport default {\n\tnamespaced: true,\n\t\n\tstate: {\n\t\t// split the difference here between what comes from the api / what goes to a different api / and what are internal flags i need\n\n\t\tannualSubscriptionPrice: '',\n\t\tchargeTax: false,\n\t\tcurrentExpirationDate: '',\n\t\tcustomerId: 0,\n\t\tdescription: '',\n\t\tdiscount: 0, \n\t\tgrandTotal: 0,\n\t\tisAutomated: false,\n\t\tisRenewal: false,\n\t\tisSuccessful: false,\n\t\tpaymentMethod: null,\t// default payment identifier\n\t\tprioritySupport: false,\n\t\tproducts: [],\n\t\tpromotionalCode: {},\t// object : gets filled in when appling a promo code\n\t\tprices: {},\n\t\tpurchaseAttempts: 0,\n\t\treferringCustomerId: 0,\n\t\trenewalPeriod: 0, // 1 - Semi / 2 - Annual\n\t\trenewalType: 0,\t// 1 - Auto / 2 = Manual\n\t\tshoppingCartUserId: 0,\n\t\tsubTotal: 0,\t// what is used for calculations and to send to the API \n\t\ttax: 0,\n\t\tzipCode: '',\n\n\t\tproRatedPrioritySupportPrice: 0,\n\t\tpurchaseId: '',\n\t\ttransactionId: '',\n\t\tsubTotalDisplay: 0,\t// what gets displayed to the user\n\n\t\t// specific to the payment method for this transaction only\n\t\taccountNumber: '',\n\t\taccountType: '1',\t// 1 - Checking / 2 - Saving\n\t\tbankName: '',\n\t\tcardNumber: '',\n\t\tcreditCardType: '',\t// text returned from Cleave.js - amex mastercard visa diners discover jcb dankort instapayment uatp mir unionPay\n\t\texpirationDateOutput: '',\n\t\texpirationMonth: '',\n\t\texpirationYear: '',\n\t\tfirstName: '',\n\t\tisNonUsAddress: false,\n\t\tlastName: '',\n\t\tpaymentTypeId: config.enums.CartPaymentType.CARD,\n\t\troutingNumber: '',\n\t\tverificationCode: '',\n\t},\n\n\t\n // \"\": 1,\n\t//CartPaymentType\n\t\n\tmutations: {\n\t\tCLEAR_PAYMENT_METHOD(state){\n\t\t\tstate.paymentMethod = null;\n\t\t},\n\t\tCLEAR_PRODUCTS_ARRAY(state){\n\t\t\tstate.products = [];\n\t\t},\n\t\tPUSH_TO_PRODUCTS_ARRAY(state, value){\n\t\t\tstate.products.push(value);\n\t\t},\n\t\tSET_ANNUAL_SUBSCRIPTION_PRICE(state, value){\n\t\t\tstate.annualSubscriptionPrice = value;\n\t\t},\n\t\tSET_CHARGE_TAX(state, value){\n\t\t\tstate.chargeTax = value;\n\t\t},\n\t\tSET_CURRENT_EXPIRATION_DATE(state, value){\n\t\t\tstate.currentExpirationDate = value;\n\t\t},\n\t\tSET_CUSTOMER_ID(state, value){\n\t\t\tstate.customerId = value;\n\t\t},\n\t\tSET_DESCRIPTION(state, value){\n\t\t\tstate.description = value;\n\t\t},\n\t\tSET_DISCOUNT(state, value){\n\t\t\tstate.discount = value;\n\t\t},\n\t\tSET_GRAND_TOTAL(state, value){\n\t\t\tstate.grandTotal = value;\n\t\t},\n\t\tSET_IS_AUTOMATED(state, value){\n\t\t\tstate.isAutomated = value;\n\t\t},\n\t\tSET_IS_RENEWAL(state, value){\n\t\t\tstate.isRenewal = value;\n\t\t},\n\t\tSET_IS_SUCCESSFUL(state, value){\n\t\t\tstate.isSuccessful = value;\n\t\t},\n\t\tSET_PAYMENT_METHOD(state, value){\n\t\t\tstate.paymentMethod = value;\n\t\t},\n\t\tSET_PRIORITY_SUPPORT(state, value){\n\t\t\tstate.prioritySupport = value;\n\t\t},\n\t\tSET_PRO_RATED_PRIORITY_SUPPORT_PRICE(state, value){\n\t\t\tstate.proRatedPrioritySupportPrice = value;\n\t\t},\n\t\tSET_PRODUCTS(state, value){\n\t\t\tstate.products = value;\n\t\t},\n\t\tSET_PROMOTIONAL_CODE(state, value){\n\t\t\tstate.promotionalCode = value;\n\t\t},\n\t\tSET_PRICES(state, value){\n\t\t\tstate.prices = value;\n\t\t},\n\t\tSET_PURCHASE_ATTEMPTS(state, value){\n\t\t\tstate.purchaseAttempts = value;\n\t\t},\n\t\tSET_PURCHASE_ID(state, value){\n\t\t\tstate.purchaseId = value;\n\t\t},\n\t\tSET_REFERRING_CUSTOMER_ID(state, value){\n\t\t\tstate.referringCustomerId = value;\n\t\t},\n\t\tSET_RENEWAL_PERIOD(state, value){\n\t\t\tstate.renewalPeriod = value;\n\t\t},\n\t\tSET_RENEWAL_TYPE(state, value){\n\t\t\tstate.renewalType = value;\n\t\t},\n\t\tSET_SHOPPING_CART_USER_ID(state, value){\n\t\t\tstate.shoppingCartUserId = value;\n\t\t},\n\t\tSET_SUBTOTAL(state, value){\n\t\t\tstate.subTotal = value;\n\t\t},\n\t\tSET_SUBTOTAL_DISPLAY(state, value){\n\t\t\tstate.subTotalDisplay = value;\n\t\t},\n\t\tSET_TAX(state, value){\n\t\t\tstate.tax = value;\n\t\t},\n\t\tSET_TRANSACTION_ID(state, value){\n\t\t\tstate.transactionId = value;\n\t\t},\n\t\tSET_ZIP_CODE(state, value){\n\t\t\tstate.zipCode = value;\n\t\t},\n\n\t\t\t\t\n\t\tSET_ACCOUNT_NUMBER(state, value){\n\t\t\tstate.accountNumber = value;\n\t\t},\n\t\tSET_ACCOUNT_TYPE(state, value){\n\t\t\tstate.accountType = value;\n\t\t},\n\t\tSET_BANK_NAME(state, value){\n\t\t\tstate.bankName = value;\n\t\t},\n\t\tSET_CARD_NUMBER(state, value){\n\t\t\tstate.cardNumber = value;\n\t\t},\n\t\tSET_CREDIT_CARD_TYPE(state, value){\n\t\t\t// convert cleave.js card string into readable name\n\t\t\tlet readValue = '';\n\n\t\t\tswitch (value){\n\t\t\t\tcase 'amex':\n\t\t\t\t\treadValue = 'Amex';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'discover':\n\t\t\t\t\treadValue = 'Discover';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'jcb':\n\t\t\t\t\treadValue = 'JCB';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'mastercard':\n\t\t\t\t\treadValue = 'MasterCard';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'visa':\n\t\t\t\t\treadValue = 'Visa';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tstate.creditCardType = readValue;\n\t\t},\n\t\tSET_EXPIRATION_DATE_OUTPUT(state, value){\n\t\t\tstate.expirationDateOutput = value;\n\t\t},\n\t\tSET_EXPIRATION_MONTH(state, value){\n\t\t\tstate.expirationMonth = value;\n\t\t},\n\t\tSET_EXPIRATION_YEAR(state, value){\n\t\t\tstate.expirationYear = value;\n\t\t},\n\t\tSET_FIRST_NAME(state, value){\n\t\t\tstate.firstName = value;\n\t\t},\n\t\tSET_LAST_NAME(state, value){\n\t\t\tstate.lastName = value;\n\t\t},\n\t\tSET_IS_PRIORITY_SUPPORT(state, value){\n\t\t},\n\t\tSET_IS_NON_US_ADDRESS(state, value){\n\t\t\tstate.isNonUsAddress = value;\n\t\t},\n\t\tSET_PAYMENT_TYPE_ID(state, value){\n\t\t\tstate.paymentTypeId = value;\n\t\t},\n\t\tSET_ROUTING_NUMBER(state, value){\n\t\t\tstate.routingNumber = value;\n\t\t},\n\t\tSET_VERIFICATION_CODE(state, value){\n\t\t\tstate.verificationCode = value;\n\t\t},\n\t},\n\n\tactions:{\n\t\t// build the cart object from the vuex store state (used when i need to send the entire cart object to an api call)\n\t\tassembleObject({commit, state}) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tlet isCreditCard = true;\n\t\t\t\tif(state.paymentTypeId === config.enums.CartPaymentType.ECHECK){\n\t\t\t\t\tisCreditCard = false;\n\t\t\t\t}\n\n\t\t\t\tif(!state.paymentMethod){\n\t\t\t\t\tif(state.accountNumber === '' && state.cardNumber === ''){\n\t\t\t\t\t\t// no actual payment info has been entered yet\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// paymentMethod is null - set it if there is anything to set\n\n\t\t\t\t\t\tlet paymentMethodName = '';\n\t\t\t\t\t\tif(isCreditCard){\n\t\t\t\t\t\t\tpaymentMethodName = 'Credit Card Ending In ' + state.cardNumber.slice(state.cardNumber.length - 4, state.cardNumber.length);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpaymentMethodName = 'E-Check from Account Ending In ' + state.accountNumber.slice(state.accountNumber.length - 4, state.accountNumber.length);\n\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\tif(isCreditCard){\n\t\t\t\t\t\t\tcommit('SET_PAYMENT_METHOD', {\n\t\t\t\t\t\t\t\tcardNumber: state.cardNumber.replace(/\\s/g, ''),\n\t\t\t\t\t\t\t\tcardType: state.creditCardType,\n\t\t\t\t\t\t\t\texpirationMonth: state.expirationMonth.padStart(2, '0'),\n\t\t\t\t\t\t\t\texpirationYear: state.expirationYear.padStart(4, '0'),\n\t\t\t\t\t\t\t\tname: paymentMethodName,\n\t\t\t\t\t\t\t\tnameOnCard: state.firstName + ' ' + state.lastName,\n\t\t\t\t\t\t\t\tpaymentMethodID: 0,\t// pass this as 0 if it's a new user using a new payment method\n\t\t\t\t\t\t\t\tpaymentTypeID: state.paymentTypeId,\n\t\t\t\t\t\t\t\tverificationCode: state.verificationCode.padEnd(3, '0'),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcommit('SET_PAYMENT_METHOD', {\n\t\t\t\t\t\t\t\taccountNumber: state.accountNumber,\n\t\t\t\t\t\t\t\taccountType: state.accountType,\n\t\t\t\t\t\t\t\tbankName: state.bankName,\n\t\t\t\t\t\t\t\tname: paymentMethodName,\n\t\t\t\t\t\t\t\t// nameOnCard: state.firstName + ' ' + state.lastName,\n\t\t\t\t\t\t\t\tpaymentMethodID: 0,\t// pass this as 0 if it's a new user using a new payment method\n\t\t\t\t\t\t\t\tpaymentTypeID: state.paymentTypeId,\n\t\t\t\t\t\t\t\troutingNumber: state.routingNumber,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}//e:if:!paymentMethod\n\n\t\t\t\t// this store object will get sent to make the actual purchase\n\t\t\t\tlet currentStoreObject = {\n\t\t\t\t\tannualSubscriptionPrice: state.annualSubscriptionPrice,\n\t\t\t\t\tchargeTax: state.chargeTax,\n\t\t\t\t\tcurrentExpirationDate: state.currentExpirationDate,\n\t\t\t\t\tcustomerID: state.customerId || 0,\n\t\t\t\t\tdescription: state.description,\n\t\t\t\t\tdiscount: state.discount, \n\t\t\t\t\tgrandTotal: state.grandTotal,\n\t\t\t\t\tisAutomated: state.isAutomated,\n\t\t\t\t\tisRenewal: state.isRenewal,\n\t\t\t\t\tisSuccessful: state.isSuccessful,\n\t\t\t\t\tpaymentMethod: state.paymentMethod,\n\t\t\t\t\tprices: state.prices,\n\t\t\t\t\tprioritySupport: state.prioritySupport,\n\t\t\t\t\tproducts: state.products,\n\t\t\t\t\tpromotionalCode: state.promotionalCode,\n\t\t\t\t\tpurchaseAttempts: state.purchaseAttempts,\n\t\t\t\t\treferringCustomerID: state.referringCustomerId,\n\t\t\t\t\trenewalPeriod: state.renewalPeriod,\n\t\t\t\t\trenewalType: state.renewalType,\n\t\t\t\t\tshoppingCartUserID: state.shoppingCartUserId,\n\t\t\t\t\tsubTotal: state.subTotal,\n\t\t\t\t\ttax: state.tax,\n\t\t\t\t\tzipCode: state.zipCode,\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// console.log('currentStoreObject');\n\t\t\t\t// console.log(currentStoreObject);\n\n\t\t\t\tresolve(currentStoreObject);\n\t\t\t});//e:Promise\n\t\t},//e:assembleObject\n\n\t\t// gets a cart object via api call\n\t\tgetNewCart({commit}, $opts) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tlet params = {};\n\t\t\t\tif(_has($opts, 'shoppingCartUserID')){\n\t\t\t\t\tparams['shoppingCartUserID'] = $opts.shoppingCartUserID\n\t\t\t\t}\n\n\t\t\t\t// without parameters this will use the generated token to build a shopping cart object and return it\n\t\t\t\tApiS_MakeCall({\n\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\tparams,\n\t\t\t\t\tresponseType: 'json',\n\t\t\t\t\turl: 'v4/Purchase/Cart',\n\t\t\t\t}).then((responseData)=>{\n\t\t\t\t\t// console.log('v4/Purchase/Cart responseData')\n\t\t\t\t\t// console.log(responseData);\n\n\t\t\t\t\t// this response should be the \"master cart\" object\n\t\t\t\t\tcommit('SET_ANNUAL_SUBSCRIPTION_PRICE', responseData.annualSubscriptionPrice);\n\t\t\t\t\tcommit('SET_CHARGE_TAX', responseData.chargeTax);\n\t\t\t\t\tcommit('SET_CURRENT_EXPIRATION_DATE', responseData.currentExpirationDate);\n\t\t\t\t\tcommit('SET_CUSTOMER_ID', responseData.customerID);\n\t\t\t\t\tcommit('SET_DESCRIPTION', responseData.description);\n\t\t\t\t\tcommit('SET_DISCOUNT', responseData.discount);\n\t\t\t\t\tcommit('SET_GRAND_TOTAL', responseData.grandTotal);\n\t\t\t\t\tcommit('SET_IS_AUTOMATED', responseData.isAutomated);\n\t\t\t\t\tcommit('SET_IS_RENEWAL', responseData.isRenewal);\n\t\t\t\t\tcommit('SET_IS_SUCCESSFUL', responseData.isSuccessful);\n\t\t\t\t\tcommit('SET_PAYMENT_METHOD', responseData.paymentMethod);\n\t\t\t\t\tcommit('SET_PRIORITY_SUPPORT', responseData.prioritySupport);\n\t\t\t\t\tcommit('SET_PRODUCTS', responseData.products);\n\t\t\t\t\tcommit('SET_PROMOTIONAL_CODE', {});\t// keep this an empty object since you are making a new cart i don't want any left over promo code data\n\t\t\t\t\tcommit('SET_PRICES', responseData.prices);\n\t\t\t\t\tcommit('SET_PURCHASE_ATTEMPTS', responseData.purchaseAttempts);\n\t\t\t\t\tcommit('SET_REFERRING_CUSTOMER_ID', 0);\n\t\t\t\t\tcommit('SET_SHOPPING_CART_USER_ID', responseData.shoppingCartUserID);\n\t\t\t\t\tcommit('SET_SUBTOTAL', responseData.subTotal);\n\t\t\t\t\tcommit('SET_SUBTOTAL_DISPLAY', responseData.subTotal);\n\t\t\t\t\tcommit('SET_TAX', responseData.tax);\n\t\t\t\t\tcommit('SET_ZIP_CODE', responseData.zipCode);\n\t\t\t\t\t\n\t\t\t\t\tif(responseData.renewalPeriod === 0){\n\t\t\t\t\t\t// 0 is none - usually for newly created accounts, nudge them into annual subscription\n\t\t\t\t\t\tcommit('SET_RENEWAL_PERIOD', config.enums.SubscriptionRenewalPeriod.ANNUAL);\n\t\t\t\t\t\tcommit('SET_RENEWAL_TYPE', config.enums.SubscriptionRenewalType.AUTO);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcommit('SET_RENEWAL_PERIOD', responseData.renewalPeriod);\n\t\t\t\t\t\tcommit('SET_RENEWAL_TYPE', responseData.renewalType);\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve();\n\t\t\t\t});//e:ApiS_MakeCall\n\t\t\t\t\n\t\t\t});//e:Promise\n\t\t},//e:getNewCart\n\n\t\t// after any change, keep the cart totals updated\n\t\tupdateCartTotals({commit, rootState, state}, $opts) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\t// flag for purchasing priority support only\n\t\t\t\tlet _isPrioritySupportOnly = false;\n\t\t\t\tif(_has($opts, 'isPrioritySupportOnly')){\n\t\t\t\t\t_isPrioritySupportOnly = $opts.isPrioritySupportOnly;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcommit('CLEAR_PRODUCTS_ARRAY');\n\n\t\t\t\t// subtotal\n\t\t\t\tlet calcSubTotal = 0;\n\n\t\t\t\tif(_isPrioritySupportOnly){\n\n\t\t\t\t\t// purchasing priority support only\n\t\t\t\t\t// i need get \"prorated\" amount that goes in for this specific transaction\n\n\t\t\t\t\tif(rootState.customer.renewalPeriod === config.enums.SubscriptionRenewalPeriod.ANNUAL){\n\t\t\t\t\t\tcommit('PUSH_TO_PRODUCTS_ARRAY', {\n\t\t\t\t\t\t\t\"productID\": 204,\n\t\t\t\t\t\t\t\"name\": \"PERRLA Priority Support Annual Subscription\",\n\t\t\t\t\t\t\t\"price\": state.proRatedPrioritySupportPrice\n\t\t\t\t\t\t});\t\n\n\t\t\t\t\t} else if(rootState.customer.renewalPeriod === config.enums.SubscriptionRenewalPeriod.SEMI){\n\t\t\t\t\t\tcommit('PUSH_TO_PRODUCTS_ARRAY', {\n\t\t\t\t\t\t\t\"productID\": 206,\n\t\t\t\t\t\t\t\"name\": \"PERRLA Priority Support Semi-Annual Subscription\",\n\t\t\t\t\t\t\t\"price\": state.proRatedPrioritySupportPrice\n\t\t\t\t\t\t});\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tcalcSubTotal = state.proRatedPrioritySupportPrice;\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tcommit('SET_DISCOUNT', 0);\n\t\t\t\t\tcommit('SET_SUBTOTAL', calcSubTotal);\n\t\t\t\t\tcommit('SET_SUBTOTAL_DISPLAY', calcSubTotal);\n\n\t\t\t\t\t// tax\n\t\t\t\t\tlet calcTaxApplied = 0;\n\t\t\t\t\tif(state.chargeTax){\n\t\t\t\t\t\tcalcTaxApplied = Math.round((taxRateTN * calcSubTotal) * 100) / 100;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tcommit('SET_TAX', calcTaxApplied);\n\t\t\t\t\t\n\t\t\t\t\t// total\n\t\t\t\t\tcommit('SET_GRAND_TOTAL', Math.round((calcSubTotal + calcTaxApplied) * 100) / 100);\n\n\t\t\t\t} else {\n\t\t\t\t\tif(state.renewalPeriod === config.enums.SubscriptionRenewalPeriod.ANNUAL){\n\t\t\t\t\t\tcommit('PUSH_TO_PRODUCTS_ARRAY', {\n\t\t\t\t\t\t\t\"productID\": 801,\n\t\t\t\t\t\t\t\"name\": \"PERRLA Annual Subscription\",\n\t\t\t\t\t\t\t\"price\": state.annualSubscriptionPrice\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcalcSubTotal += state.annualSubscriptionPrice;\n\t\n\t\t\t\t\t\tif(state.prioritySupport){\n\t\t\t\t\t\t\tcommit('PUSH_TO_PRODUCTS_ARRAY', {\n\t\t\t\t\t\t\t\t\"productID\": 204,\n\t\t\t\t\t\t\t\t\"name\": \"PERRLA Priority Support Annual Subscription\",\n\t\t\t\t\t\t\t\t\"price\": state.prices.prioritySupportAnnualSubscription\n\t\t\t\t\t\t\t});\t\n\t\t\t\t\t\t\tcalcSubTotal += state.prices.prioritySupportAnnualSubscription;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if(state.renewalPeriod === config.enums.SubscriptionRenewalPeriod.SEMI){\n\t\t\t\t\t\tcommit('PUSH_TO_PRODUCTS_ARRAY', {\n\t\t\t\t\t\t\t\"productID\": 803,\n\t\t\t\t\t\t\t\"name\": \"PERRLA Semi-Annual Subscription\",\n\t\t\t\t\t\t\t\"price\": state.prices.semiAnnualSubscription\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcalcSubTotal += state.prices.semiAnnualSubscription;\n\t\n\t\t\t\t\t\tif(state.prioritySupport){\n\t\t\t\t\t\t\tcommit('PUSH_TO_PRODUCTS_ARRAY', {\n\t\t\t\t\t\t\t\t\"productID\": 206,\n\t\t\t\t\t\t\t\t\"name\": \"PERRLA Priority Support Semi-Annual Subscription\",\n\t\t\t\t\t\t\t\t\"price\": state.prices.prioritySupportSemiAnnualSubscription\n\t\t\t\t\t\t\t});\t\n\t\t\t\t\t\t\tcalcSubTotal += state.prices.prioritySupportSemiAnnualSubscription;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// check \n\t\t\t\t\tcommit('SET_SUBTOTAL', calcSubTotal);\n\t\t\t\t\t\n\t\t\t\t\tlet discountAmount = 0;\n\t\n\t\t\t\t\t// check for a promotionalCode object\n\t\t\t\t\tif(!_isEmpty(state.promotionalCode)){\n\t\t\t\t\t\t// calculate a promo code - just in case\n\t\t\t\t\t\tif(state.promotionalCode.codeType === 1 && state.promotionalCode.discountPercent !== 0){\n\t\t\t\t\t\t\t// apply a percent\n\t\t\t\t\t\t\tdiscountAmount = Math.round((state.promotionalCode.discountPercent / 100) * calcSubTotal * 100) / 100;\n\t\t\t\t\t\t} else if(state.promotionalCode.codeType === 3 && state.promotionalCode.dollarDiscount !== 0){\n\t\t\t\t\t\t\t// apply an amount\n\t\t\t\t\t\t\tif(state.promotionalCode.dollarDiscount !== 0){\n\t\t\t\t\t\t\t\tdiscountAmount = state.promotionalCode.dollarDiscount;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcommit('SET_DISCOUNT', discountAmount);\n\t\t\t\t\t\n\t\t\t\t\t// remove any promo code discounts\n\t\t\t\t\tcalcSubTotal = Math.round((calcSubTotal - discountAmount) * 100) / 100;\n\t\t\t\t\t\n\t\t\t\t\tif(calcSubTotal === 0){\n\t\t\t\t\t\t// the user doesn't owe any money (this is 100% discount)\n\t\t\t\t\t\tcommit('SET_RENEWAL_TYPE', config.enums.SubscriptionRenewalType.AUTO);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tcommit('SET_SUBTOTAL_DISPLAY', calcSubTotal);\n\t\n\t\t\t\t\t// tax\n\t\t\t\t\tlet calcTaxApplied = 0;\n\t\t\t\t\tif(state.chargeTax){\n\t\t\t\t\t\tcalcTaxApplied = Math.round((taxRateTN * calcSubTotal) * 100) / 100;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tcommit('SET_TAX', calcTaxApplied);\n\t\t\t\t\t\n\t\t\t\t\t// total\n\t\t\t\t\tcommit('SET_GRAND_TOTAL', Math.round((calcSubTotal + calcTaxApplied) * 100) / 100);\n\t\n\t\t\t\t\tlet expirationDate;\t\n\n\t\t\t\t\tif(state.isRenewal){\n\t\t\t\t\t\t// RENEWAL - set end date based on user's expiration date\n\t\t\t\t\t\texpirationDate = new Date(state.currentExpirationDate);\t\n\n\t\t\t\t\t\tif(state.renewalPeriod === config.enums.SubscriptionRenewalPeriod.ANNUAL){\n\t\t\t\t\t\t\texpirationDate = addMonths(expirationDate, 12);\n\t\t\t\t\t\t} else if(state.renewalPeriod === config.enums.SubscriptionRenewalPeriod.SEMI){\n\t\t\t\t\t\t\texpirationDate = addMonths(expirationDate, 6);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// NEW PURCHASE - set end date based on today\n\t\t\t\t\t\t\n\t\t\t\t\t\texpirationDate = new Date();\t// start a new date object\n\n\t\t\t\t\t\tif(state.referringCustomerId === 0){\n\t\t\t\t\t\t\tif(state.renewalPeriod === config.enums.SubscriptionRenewalPeriod.ANNUAL){\n\t\t\t\t\t\t\t\texpirationDate = addMonths(expirationDate, 12);\n\t\t\t\t\t\t\t} else if(state.renewalPeriod === config.enums.SubscriptionRenewalPeriod.SEMI){\n\t\t\t\t\t\t\t\texpirationDate = addMonths(expirationDate, 6);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// add three months\n\t\t\t\t\t\t\tif(state.renewalPeriod === config.enums.SubscriptionRenewalPeriod.ANNUAL){\n\t\t\t\t\t\t\t\texpirationDate = addMonths(expirationDate, 15);\n\t\t\t\t\t\t\t} else if(state.renewalPeriod === config.enums.SubscriptionRenewalPeriod.SEMI){\n\t\t\t\t\t\t\t\texpirationDate = addMonths(expirationDate, 9);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet epirationDateOutput = dateFormat(expirationDate, 'mmm') + '. ' + dateFormat(expirationDate, 'd') + ', ' + dateFormat(expirationDate, 'yyyy');\n\n\t\t\t\t\tcommit('SET_EXPIRATION_DATE_OUTPUT', epirationDateOutput);\n\n\t\t\t\t}\n\n\t\t\t\tresolve();\n\t\t\t});//e:promise\n\t\t},//e:updateCartTotals\n\t},\n}","/*\n- Class Modules\n-- ex: this.$store.state.classes.x\n*/\n\nexport default {\n\tnamespaced: true,\n\n\tstate: {\n\t\t// non local storage states\n\t\tlist: [],\t\t\t// array of objects sets in /Sync\n\t\topenObject:\t{},\t// the class open that is being edited\n\t},//e:state\n\n\tmutations: {\n\t\tSET_OPEN_OBJECT(state, value){\n\t\t\tstate.openObject = value;\n\t\t},\n\t\tSET_LIST(state, value) {\n\t\t\tstate.list = value;\n\t\t},\n\t},//e:mutations\n}\n","/*\n- Customer\n-- Storing all customer data usually populated from Sync call\n-- ex: this.$store.state.customer.x\n-- 2023.11.17\n*/\n\nimport _has from 'lodash/has';\nimport config from '@/config';\n\nexport default {\n\tnamespaced: true,\n\n\tstate:{\n\t\t// local storage states\n\t\temail:\t'',\t\t\t// auto-fill when creating a support ticket\n\n\t\t// local storage in PO only (not in the Add-In)\n\t\tfullName:\t'',\t\t// display in header dropdown menu\n\t\tthemeId: 0,\n\n\t\t// non local storage states\n\t\talternativeEmails: [],\t\t// array\n\t\tcalendarStartingDayOfWeek: 0,\n\t\tcalendarStartingHour: 0,\t// think of this as time zone offset\n\t\tcalendarViewId: 0,\n\t\texpirationDate: '',\n\t\tfirstName: '',\n\t\thasPrioritySupport: false,\n\t\tid: 0,\t\t\t\t// auto-fill when creating a support ticket\n\t\tinstitution: '',\n\t\tisCancelled: false,\n\t\tisImpersonating: false,\n\t\tisRecurring: false,\n\t\tlastName: '',\n\t\torganizationExpirationDate: null,\n\t\torganizationId: 0,\n\t\torganizationStatusId: 0,\n\t\tpaperAutoSave: 0,\n\t\trenewalPeriod: 0,\n\t\trole: 0,\n\t\ttimeZone: 0,\n\t\t\n\t},//e:state\n\n\tmutations: {\n\t\tPUSH_ONE_ALTERNATIVE_EMAIL(state, value) {\n\t\t\t// make sure this gets pushed to the front\n\t\t\tstate.alternativeEmails.unshift(value);\n\t\t},\n\t\tSET_ALTERNATIVE_EMAILS(state, value) {\n\t\t\tstate.alternativeEmails = value;\n\t\t},\n\t\tSET_CALENDAR_STARTING_DAY_OF_WEEK(state, value) {\n\t\t\tstate.calendarStartingDayOfWeek = value;\n\t\t},\n\t\tSET_CALENDAR_STARTING_HOUR(state, value) {\n\t\t\tstate.calendarStartingHour = value;\n\t\t},\n\t\tSET_CALENDAR_VIEW_ID(state, value) {\n\t\t\tstate.calendarViewId = value;\n\t\t},\n\t\tSET_EMAIL(state, value) {\n\t\t\tstate.email = value;\n\t\t},\n\t\tSET_EXPIRATION_DATE(state, value){\n\t\t\tstate.expirationDate = value;\n\t\t},\n\t\tSET_FIRST_NAME(state, value){\n\t\t\tstate.firstName = value;\n\t\t},\n\t\tSET_FULL_NAME(state, value) {\n\t\t\tstate.fullName = value;\n\t\t},\n\t\tSET_HAS_PRIORITY_SUPPORT(state, value) {\n\t\t\tstate.hasPrioritySupport = value;\n\t\t},\n\t\tSET_ID(state, value) {\n\t\t\tstate.id = value;\n\t\t},\n\t\tSET_INSTITUTION(state, value) {\n\t\t\tstate.institution = value;\n\t\t},\n\t\tSET_IS_CANCELLED(state, value) {\n\t\t\tstate.isCancelled = value;\n\t\t},\n\t\tSET_IS_IMPERSONATING(state, value) {\n\t\t\tstate.isImpersonating = value;\n\t\t},\n\t\tSET_IS_RECURRING(state, value) {\n\t\t\tstate.isRecurring = value;\n\t\t},\n\t\tSET_LAST_NAME(state, value) {\n\t\t\tstate.lastName = value;\n\t\t},\n\t\tSET_ORGANIZATION_EXPIRATION_DATE(state, value) {\n\t\t\tstate.organizationExpirationDate = value;\n\t\t},\n\t\tSET_ORGANIZATION_ID(state, value) {\n\t\t\tstate.organizationId = value;\n\t\t},\n\t\tSET_ORGANIZATION_STATUS_ID(state, value) {\n\t\t\tstate.organizationStatusId = value;\n\t\t},\n\t\tSET_PAPER_AUTO_SAVE(state, value) {\n\t\t\tstate.paperAutoSave = value;\n\t\t},\n\t\tSET_RENEWAL_PERIOD(state, value){\n\t\t\tstate.renewalPeriod = value;\n\t\t},\n\t\tSET_ROLE(state, value) {\n\t\t\tstate.role = value;\n\t\t},\n\t\tSET_THEME_ID(state, value) {\n\t\t\tstate.themeId = value;\n\t\t},\n\t\tSET_TIME_ZONE(state, value) {\n\t\t\tstate.timeZone = value;\n\t\t},\n\t\t\n\t},//e:mutations\n\n\tactions: {\n\t\t// dispatched inside a Sync call\n\t\tsetSiteTheme({commit}, $opts) {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tif(config.platformId === config.enums.Platform.ADD_IN){\n\t\t\t\t\t// Add-In sets the theme based on Word settings\n\t\t\t\t\treturn resolve();\n\n\t\t\t\t} else if(config.platformId === config.enums.Platform.ONLINE){\n\t\t\t\t\tif(_has($opts, 'legacyThemeId')){\n\t\t\t\t\t\t// legacyThemeId is what comes in from the Sync call, it will be a 1 regular / 2 dark / 5 serrena (the other numbers do something too)\n\t\t\t\t\t\t// convert this id into something i can store here in the SPA \n\t\t\t\t\t\tlet convertedThemeId = config.enums.Theme.REGULAR;\n\t\n\t\t\t\t\t\t// convert this into that\n\t\t\t\t\t\tswitch($opts.legacyThemeId){\n\t\t\t\t\t\t\tcase 1:\t// Normal\n\t\t\t\t\t\t\t\tdocument.body.classList.remove('theme-dark');\n\t\t\t\t\t\t\t\tdocument.body.classList.remove('theme-serrena');\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\t// Dark\n\t\t\t\t\t\t\tcase 4:\t// ?\n\t\t\t\t\t\t\t\tconvertedThemeId = config.enums.Theme.DARK;\n\t\t\t\t\t\t\t\tdocument.body.classList.add('theme-dark');\n\t\t\t\t\t\t\t\tdocument.body.classList.remove('theme-serrena');\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3:\t// ?\n\t\t\t\t\t\t\tcase 5:\t// Serrena\n\t\t\t\t\t\t\t\tconvertedThemeId = config.enums.Theme.SERRENA;\n\t\t\t\t\t\t\t\tdocument.body.classList.add('theme-serrena');\n\t\t\t\t\t\t\t\tdocument.body.classList.remove('theme-dark');\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// save new value\n\t\t\t\t\t\tcommit('SET_THEME_ID', convertedThemeId);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tdocument.body.classList.add('platform-online');\n\t\t\t\t\t\n\t\t\t\t\treturn resolve();\n\t\t\t\t}\n\t\t\t});//e:Promise\n\t\t},//e:setSiteTheme\n\t},//e:actions\n}\n","/*\n- Forms\n-- 2023.07.07\n-- ex: this.$store.state.forms.x\n*/\nimport _has from 'lodash/has';\nimport config from '@/config';\n\nexport default {\n\tnamespaced: true,\n\t\n\tstate:{\n\t\tlist:\t[],\t// Array of Form Objects\n\t\tvalidation: [],\t// Array of Validation Objects\n\t},//e:state\n\n\tmutations: {\n\t\tADD_FORM_TO_LIST(state, $opts){\n\t\t\tstate.list.push({\n\t\t\t\tformId: $opts.formId,\n\t\t\t\tisDirty: false,\n\t\t\t\tisValid: false,\n\t\t\t});\n\t\t},\n\t\tADD_VALIDATION(state, $opts){\n\t\t\tstate.validation.push({\n\t\t\t\tformId: $opts.formId,\n\t\t\t\tfullId: $opts.fullId,\n\t\t\t\tinvalidErrorMessage: $opts.invalidErrorMessage,\n\t\t\t\tisShown: false,\t\n\t\t\t\tvalidateEnum: $opts.validateEnum,\n\t\t\t});\n\t\t},\n\t\tMARK_ALL_CLEAN(state){\n\t\t\tstate.list.forEach((formData)=>{\n\t\t\t\tformData.isDirty = false;\n\t\t\t});\n\t\t},\n\t\tMARK_FORM_CLEAN_BY_ID(state, $opts){\n\t\t\tlet findIndex = state.list.findIndex((formData)=>{\n\t\t\t\treturn formData.formId === $opts.formId;\n\t\t\t});\n\t\t\tif(findIndex !== -1){\n\t\t\t\tstate.list[findIndex].isDirty = false;\n\t\t\t}\n\t\t},\n\t\tMARK_FORM_DIRTY_BY_ID(state, $opts){\n\t\t\tlet findIndex = state.list.findIndex((formData)=>{\n\t\t\t\treturn formData.formId === $opts.formId;\n\t\t\t});\n\t\t\tif(findIndex > -1){\n\t\t\t\tstate.list[findIndex].isDirty = true;\n\t\t\t}\n\t\t},\n\t\tMARK_FORM_INVALID_BY_ID(state, $opts){\n\t\t\tlet findIndex = state.list.findIndex((formData)=>{\n\t\t\t\treturn formData.formId === $opts.formId;\n\t\t\t});\n\t\t\tif(findIndex !== -1){\n\t\t\t\tstate.list[findIndex].isValid = false;\n\t\t\t}\n\t\t},\n\t\tMARK_FORM_VALID_BY_ID(state, $opts){\n\t\t\tlet findIndex = state.list.findIndex((formData)=>{\n\t\t\t\treturn formData.formId === $opts.formId;\n\t\t\t});\n\t\t\tif(findIndex !== -1){\n\t\t\t\tstate.list[findIndex].isValid = true;\n\t\t\t}\n\t\t},\n\t\tREMOVE_FORM_BY_ID(state, $opts){\n\t\t\tlet findIndex = state.list.findIndex((formData)=>{\n\t\t\t\treturn formData.formId === $opts.formId;\n\t\t\t});\n\t\t\tif(findIndex > -1){\n\t\t\t\tstate.list.splice(findIndex, 1);\t\n\t\t\t}\n\t\t},\n\t\tSET_VALIDATION(state, value){\n\t\t\tstate.validation = value;\n\t\t},\n\t},//e:mutations\n\n\tactions:{\n\t\taddValidation({commit}, $opts){\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tlet invalidErrorMessage = '';\n\n\t\t\t\tswitch($opts.validateEnum){\n\t\t\t\t\tcase config.enums.Validation.EMAIL:\n\t\t\t\t\tcase config.enums.Validation.EMAIL_REQUIRED:\n\t\t\t\t\t\tinvalidErrorMessage = 'Please enter a valid ' + $opts.fieldLabel;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase config.enums.Validation.NUMERIC:\n\t\t\t\t\tcase config.enums.Validation.NUMERIC_REQUIRED:\n\t\t\t\t\t\tinvalidErrorMessage = 'Please enter numeric ' + $opts.fieldLabel;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase config.enums.Validation.REQUIRED:\n\t\t\t\t\t\tinvalidErrorMessage = 'Please enter ' + $opts.fieldLabel;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcommit('ADD_VALIDATION', {\n\t\t\t\t\tformId: $opts.formId,\n\t\t\t\t\tfullId: $opts.fullId,\n\t\t\t\t\tinvalidErrorMessage,\n\t\t\t\t\tvalidateEnum: $opts.validateEnum,\n\t\t\t\t});\n\n\t\t\t\tresolve();\n\t\t\t});//e:promise\n\t\t}\n\t},//e:actions\n}\n","// form data for the free trial creation part\n\n/*\n- freeTrial\n-- ex: this.$store.state.freeTrial.x\n*/\n\nexport default {\n\tnamespaced: true,\n\n\tstate:{\n\t\temail: '',\n\t\tfirstName: '',\n\t\tlastName: '',\n\t\tpassword: '',\n\t\tschool: '',\n\t},//e:state\n\n\tmutations: {\n\t\tSET_EMAIL(state, value){\n\t\t\tstate.email = value;\n\t\t},\n\t\tSET_FIRST_NAME(state, value){\n\t\t\tstate.firstName = value;\n\t\t},\n\t\tSET_LAST_NAME(state, value){\n\t\t\tstate.lastName = value;\n\t\t},\n\t\tSET_PASSWORD(state, value){\n\t\t\tstate.password = value;\n\t\t},\n\t\tSET_SCHOOL(state, value){\n\t\t\tstate.school = value;\n\t\t},\n\t},//e:mutations\n}\n","/*\n- Grid Sort Orders\n-- saves into localStorage\n-- 2023.01.16\n*/\n\nexport default {\n\tnamespaced: true,\n\tstate: {\n\t\taddFromLibraryIsByName: true,\n\n\t\tpaperListOrderBy:\t'lastModifiedDate',\n\t\tpaperListSorts: {\n\t\t\t'dueDateDisplay': 1,\n\t\t\t'lastModifiedDate': -1,\n\t\t\t'title': 1,\n\t\t},\n\n\t\treferenceListOrderBy:\t'createdDate',\n\t\treferenceListSorts: {\n\t\t\t'title': 1,\n\t\t\t'createdDate': -1,\n\t\t},\n\n\t\treminderListOrderBy:\t'title',\n\t\treminderListSorts: {\n\t\t\t'title': 1,\n\t\t},\n\t\t\n\t\tsearchTerm: '',\t// each grid has it's own search component\n\t},\n\tmutations: {\n\t\tPAPER_LIST_ORDER_BY(state, value) {\n\t\t\tstate.paperListOrderBy = value;\n\t\t},\n\t\tPAPER_LIST_SORTS_TOGGLE(state, key){\n\t\t\tstate.paperListSorts[key] = state.paperListSorts[key] * -1;\n\t\t},\n\t\tREFERENCE_LIST_ORDER_BY(state, value) {\n\t\t\tstate.referenceListOrderBy = value;\n\t\t},\n\t\tREFERENCE_LIST_SORTS_TOGGLE(state, key){\n\t\t\tstate.referenceListSorts[key] = state.referenceListSorts[key] * -1;\n\t\t},\n\t\tREMINDER_LIST_ORDER_BY(state, value) {\n\t\t\tstate.reminderListOrderBy = value;\n\t\t},\n\t\tREMINDER_LIST_SORTS_TOGGLE(state, key){\n\t\t\tstate.reminderListSorts[key] = state.reminderListSorts[key] * -1;\n\t\t},\n\t\tSEARCH_TERM(state, value){\n\t\t\tstate.searchTerm = value.toLowerCase();\n\t\t},\n\t\tSET_ADD_FROM_LIBRARY_IS_BY_NAME(state, value){\n\t\t\tstate.addFromLibraryIsByName = value;\n\t\t},\n\n\t\t\n\t},\n}","/*\n- Loaders\n-- ex: this.$store.state.loaders.x\n*/\nexport default {\n\tnamespaced: true,\n\t\n\tstate:{\n\t\tshowArray: [],\t\t// Array of loader ids (strings) that are shown (each loader component deals with this on it's own)\n\t},//e:state\n\n\tmutations: {\n\t\tADD_ID(state, loaderId){\n\t\t\tif(!state.showArray.includes(loaderId)){\n\t\t\t\tstate.showArray.push(loaderId);\n\t\t\t}\n\t\t},\n\t\tREMOVE_ID(state, loaderId){\n\t\t\tif(state.showArray.includes(loaderId)){\n\t\t\t\tstate.showArray.splice(state.showArray.indexOf(loaderId), 1);\n\t\t\t}\n\t\t},\n\t},//e:mutations\n}\n","/*\n- References\n-- these all live under the reference, but extracting them here gives be easier\n-- ex: this.$store.state.references.x\n*/\n\n\nconst maxRecentReferenceTypes = 5;\n\nexport default {\n\tnamespaced: true,\n\n\tstate: {\n\t\t// local storage states\n\t\trecentTypeIds: [],\t// array: contains a list of ids for use with Recent References Tab on create\n\t\t\n\n\t\t// non local storage states\n\t\teditCitation: {},\t\t\t// this will be replaced Mid Jan. 2021 with openCitationUID\n\t\teditReference: {},\t// an open reference the user is editing \n\t\tfocusIdOnLoad: '',\t// focus on a specific reference control input or namemaker\n\t\topenCitationUID: '',\t\t// String: citationUniqueID of the citation a user is editing (this will look it up when the citation edit view is mounted())\n\t\treferenceDefaultName: '',\t// default name for a reference - create ref step 2\n\t\treferenceDefaultValue: '',\t// default value for a reference - create ref step 2\n\t\treferenceRules: [],\t// reference rules engine\n\t\treferencesInPaper: [],\t\t// Array: Each is a ReferenceObject\n\t\tupdateAfterSync: [],\t// array of references to update (if refs change in another platform)\n\t},\n\n\tmutations: {\n\t\tADD_TO_UPDATE_AFTER_SYNC(state, newReference){\n\t\t\tstate.updateAfterSync.push(newReference);\n\t\t},\n\t\tRESET_UPDATE_AFTER_SYNC(state){\n\t\t\tstate.updateAfterSync = [];\n\t\t},\n\n\t\tSET_OPEN_CITATION_UID(state, value) {\n\t\t\tstate.openCitationUID = value;\n\t\t},\n\n\t\tADD_REFERENCE_TO_PAPER(state, reference){\n\t\t\tstate.referencesInPaper.push(reference)\n\t\t},\n\t\teditCitation(state, citation) {\n\t\t\tstate.editCitation = citation;\n\t\t},\n\t\teditReference(state, reference) {\n\t\t\tstate.editReference = reference;\n\t\t},\n\t\tfocusIdOnLoad(state, focusIdOnLoad) {\n\t\t\tstate.focusIdOnLoad = focusIdOnLoad;\n\t\t},\n\n\t\tRECENT_TYPE_IDS_ADD(state, refTypeId){\n\t\t\t// 1: trim the array down to the max number\n\t\t\tif(state.recentTypeIds.length > maxRecentReferenceTypes - 1){\n\t\t\t\tstate.recentTypeIds = state.recentTypeIds.slice(0, maxRecentReferenceTypes - 1);\n\t\t\t}\n\n\t\t\t// 2: push the new type \n\t\t\tif(!state.recentTypeIds.includes(refTypeId)){\n\t\t\t\tstate.recentTypeIds.push(refTypeId);\n\t\t\t}\n\t\t},\n\n\t\tREMOVE_CITATION_FROM_PAPER(state, $opts){\n\t\t\t// find this reference index\n\t\t\tlet thisReferenceIndex = state.referencesInPaper.findIndex(ref => ref.referenceUniqueID == $opts.referenceUniqueID);\n\t\t\tif(thisReferenceIndex != -1 && state.referencesInPaper[thisReferenceIndex].citations){\n\t\t\t\t// find this citation index\n\t\t\t\tlet thisCitationIndex = state.referencesInPaper[thisReferenceIndex].citations.findIndex(cit => cit.citationUniqueID == $opts.citationUniqueID);\n\t\t\t\tif(thisCitationIndex != -1){\n\t\t\t\t\tstate.referencesInPaper[thisReferenceIndex].citations.splice(thisCitationIndex,1);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tREMOVE_REFERENCE_FROM_PAPER(state, referenceUniqueID){\n\t\t\tstate.referencesInPaper = state.referencesInPaper.filter(ref => ref.referenceUniqueID !== referenceUniqueID);\n\t\t},\n\t\treferenceDefaultName(state, referenceDefaultName) {\n\t\t\tstate.referenceDefaultName = referenceDefaultName;\n\t\t},\n\t\treferenceDefaultValue(state, referenceDefaultValue) {\n\t\t\tstate.referenceDefaultValue = referenceDefaultValue;\n\t\t},\n\t\treferenceRules(state, referenceRules) {\n\t\t\tstate.referenceRules = referenceRules;\n\t\t},\n\t\tSET_REFERENCES_IN_PAPER(state, value) {\n\t\t\tstate.referencesInPaper = value;\n\t\t},\n\t}\n\n}","/*\n- Reference Duplicate\n-- ex: this.$store.state.referenceDuplicate.x\n*/\n\nimport _has from 'lodash/has';\nimport config from '@/config';\nimport HelperGetReferenceFormatId from '@/helpers/get-reference-format-id';\nimport router from '@/router';\n\nexport default {\n\tnamespaced: true,\n\n\tstate: {\n addFromMode: 0,\n\t\tisShowWarning: false,\n referenceData: {}, // reference data when duplicating a reference\n referenceObject: {}, // reference object when duplicating a reference\n\t},\n\t\n\tmutations: {\n HIDE_WARNING(state){\n state.isShowWarning = false;\n },\n SET_ADD_FROM_MODE(state, value){\n state.addFromMode = value;\n },\n SET_REFERENCE_DATA(state, value){\n state.referenceData = value;\n },\n SET_REFERENCE_OBJECT(state, value){\n state.referenceObject = value;\n },\n \n SHOW_WARNING(state){\n\t\t\tstate.isShowWarning = true;\n\t\t},\n\t},\n\n actions:{\n processDuplicate({commit}, $opts){\n return new Promise((resolve)=>{\n commit('SHOW_WARNING');\n commit('SET_REFERENCE_DATA', $opts.refData);\n commit('SET_REFERENCE_OBJECT', $opts.referenceObject);\n commit('referenceRules/SET_REFERENCE_TYPE_ID', $opts.referenceObject.referenceID, {root: true});\n commit('referenceRules/SET_RULES_OBJECT_DATA', $opts.refData, {root: true});\n\n if(router.currentRoute.meta.module !== config.enums.Module.REFERENCE_LIST){\n let refValues = JSON.parse($opts.referenceObject.values);\n\n let _referenceFormatTypeId = HelperGetReferenceFormatId();\n\n switch(_referenceFormatTypeId){\n case config.enums.Format.APA7:\n if(_has(refValues, 'apa7') && _has(refValues.apa7, 'value')){\n if(refValues.apa7.value === ''){\n //commit('SET_ADD_FROM_MODE', config.enums.AddFromLibraryMode.FORMAT_DISABLED);\n commit('SET_ADD_FROM_MODE', config.enums.AddFromLibraryMode.REVIEW);\n } else {\n commit('SET_ADD_FROM_MODE', config.enums.AddFromLibraryMode.NORMAL);\n }\n }\n break;\n case config.enums.Format.MLA9:\n if(_has(refValues, 'mla9') && _has(refValues.mla9, 'value')){\n if(refValues.mla9.value === ''){\n //commit('SET_ADD_FROM_MODE', config.enums.AddFromLibraryMode.FORMAT_DISABLED);\n commit('SET_ADD_FROM_MODE', config.enums.AddFromLibraryMode.REVIEW);\n } else {\n commit('SET_ADD_FROM_MODE', config.enums.AddFromLibraryMode.NORMAL);\n }\n } else {\n // no MLA Value - use the APA one for now\n if(_has(refValues, 'apa7') && _has(refValues.apa7, 'value')){\n if(refValues.apa7.value === ''){\n //commit('SET_ADD_FROM_MODE', config.enums.AddFromLibraryMode.FORMAT_DISABLED);\n commit('SET_ADD_FROM_MODE', config.enums.AddFromLibraryMode.REVIEW);\n } else {\n commit('SET_ADD_FROM_MODE', config.enums.AddFromLibraryMode.REVIEW);\n }\n }\n }\n break;\n case config.enums.Format.Turabian9:\n if(_has(refValues, 'turabian9') && _has(refValues.turabian9, 'value')){\n if(refValues.turabian9.value === ''){\n //commit('SET_ADD_FROM_MODE', config.enums.AddFromLibraryMode.FORMAT_DISABLED);\n commit('SET_ADD_FROM_MODE', config.enums.AddFromLibraryMode.REVIEW);\n } else {\n commit('SET_ADD_FROM_MODE', config.enums.AddFromLibraryMode.NORMAL);\n }\n \n } else {\n // no Turabian 9 Value - use APA\n if(_has(refValues, 'apa7') && _has(refValues.apa7, 'value')){\n commit('SET_ADD_FROM_MODE', HelperCheckReferenceData($opts.referenceObject));\n }\n \n }\n break;\n }\n }//e:if\n\n return resolve();\n });//e:Promise\n }\n },\n}\n\n","// referenceRules\nimport _cloneDeep from 'lodash/cloneDeep';\nimport _forEach from 'lodash/forEach';\nimport _has from 'lodash/has';\nimport _isEmpty from 'lodash/isEmpty';\nimport config from '@/config';\nimport Engine from '@/services/reference/Engine';\nimport HelperGetReferenceFormatId from '@/helpers/get-reference-format-id';\nimport router from '@/router';\nimport { v4 as uuidv4 } from 'uuid';\n\nconst publishersDefault = {\n\t'original': [\n\t\t{\n\t\t\tcity : '',\n\t\t\tid: uuidv4().toUpperCase(),\n\t\t\tname : '',\n\t\t\tstate : '',\n\t\t},\n\t],\n\t'reference': [\n\t\t{\n\t\t\tcity : '',\n\t\t\tid: uuidv4().toUpperCase(),\n\t\t\tname : '',\n\t\t\tstate : '',\n\t\t},\n\t],\n}\n\nconst toggleSelectDefault = {\n\tdoiUrl: {\n\t\tisCommonUse: true,\n\t\tlabel: 'DOI / URL',\n\t\tselectedOption: 'doi',\n\t\toptions: {\n\t\t\tdoi: {\n\t\t\t\tdisplay: 'DOI',\n\t\t\t\thelpText: \"Only include the DOI number (10.###...).\",\n\t\t\t\tvalue: '',\n\t\t\t},\n\t\t\turl: {\n\t\t\t\tdisplay: 'URL',\n\t\t\t\thelpText: \"Type or paste the entire URL\",\n\t\t\t\tvalue: '',\n\t\t\t},\n\t\t},\n\t},\n\toriginalDoiUrl: {\n\t\tisCommonUse: true,\n\t\tlabel: 'Original DOI / URL',\n\t\tselectedOption: 'originalDoi',\n\t\toptions: {\n\t\t\toriginalDoi: {\n\t\t\t\tdisplay: 'DOI',\n\t\t\t\thelpText: \"Only include the DOI number (10.###...).\",\n\t\t\t\tvalue: '',\n\t\t\t},\n\t\t\toriginalUrl: {\n\t\t\t\tdisplay: 'URL',\n\t\t\t\thelpText: \"Type or paste the entire URL\",\n\t\t\t\tvalue: '',\n\t\t\t},\n\t\t},\n\t},\n\toriginalPagesArticle: {\n\t\tisCommonUse: true,\n\t\tlabel: 'Page Numbers / Article Number',\n\t\tselectedOption: 'originalReferencePages',\n\t\toptions: {\n\t\t\toriginalReferencePages: {\n\t\t\t\tdisplay: 'Pages',\n\t\t\t\thelpText: \"Give the page numbers that include the work (e.g., 45-78). Discontinuous pages are separated with a comma and a space (e.g., 45-78, 93).\",\n\t\t\t\tvalue: '',\n\t\t\t},\n\t\t\toriginalArticleNumber: {\n\t\t\t\tdisplay: 'Article',\n\t\t\t\thelpText: \"Do not include the prefix “Article” for the Article number.\",\n\t\t\t\tvalue: '',\n\t\t\t},\n\t\t},\n\t},\n\tpagesArticle: {\n\t\tisCommonUse: true,\n\t\tlabel: 'Page Numbers / Article Number',\n\t\tselectedOption: 'referencePages',\n\t\toptions: {\n\t\t\treferencePages: {\n\t\t\t\tdisplay: 'Pages',\n\t\t\t\thelpText: \"Give the page numbers that include the work (e.g., 45-78). Discontinuous pages are separated with a comma and a space (e.g., 45-78, 93).\",\n\t\t\t\tvalue: '',\n\t\t\t},\n\t\t\tarticleNumber: {\n\t\t\t\tdisplay: 'Article',\n\t\t\t\thelpText: \"Do not include the prefix “Article” for the Article number.\",\n\t\t\t\tvalue: '',\n\t\t\t},\n\t\t},\n\t},\n\tretractionDoiUrl: {\n\t\tisCommonUse: true,\n\t\tlabel: 'Retracted Original DOI / URL',\n\t\tselectedOption: 'retractionDoi',\n\t\toptions: {\n\t\t\tretractionDoi: {\n\t\t\t\tdisplay: 'DOI',\n\t\t\t\thelpText: \"Only include the DOI number (10.###...).\",\n\t\t\t\tvalue: '',\n\t\t\t},\n\t\t\tretractionUrl: {\n\t\t\t\tdisplay: 'URL',\n\t\t\t\thelpText: \"Type or paste the entire URL\",\n\t\t\t\tvalue: '',\n\t\t\t},\n\t\t},\n\t},\n\tretractionPagesArticle: {\n\t\tisCommonUse: false,\n\t\tlabel: 'Retracted Page Numbers / Article Number',\n\t\tselectedOption: 'retractionReferencePages',\n\t\toptions: {\n\t\t\tretractionReferencePages: {\n\t\t\t\tdisplay: 'Pages',\n\t\t\t\thelpText: \"Give the page numbers that include the work (e.g., 45-78). Discontinuous pages are separated with a comma and a space (e.g., 45-78, 93).\",\n\t\t\t\tvalue: '',\n\t\t\t},\n\t\t\tretractionArticleNumber: {\n\t\t\t\tdisplay: 'Article',\n\t\t\t\thelpText: \"Do not include the prefix “Article” for the Article number.\",\n\t\t\t\tvalue: '',\n\t\t\t},\n\t\t},\n\t},\n}//e:toggleSelectDefault\n\nconst formDataDefault = {\n\talbumTitle: '',\n\tamendment: '',\n\tanthologyTitle: '',\n\tappealCircuit: '',\n\tappealDate: '',\n\tappealPageNumber: '',\n\tappealSeries: '',\n\tappealVolume: '',\n\tarchiveName: '',\n\tarticle: '',\n\tarticleNumber: '',\n\tarticleTitle: '',\n\tattachment: '',\n\tbillNumber: '',\n\tblog: '',\n\tblogTitle: '',\n\tbookTitle: '',\n\tchannel: '',\n\tchapterTitle: '',\n\tcharterArticle: '',\n\tcircuit: '',\n\tcitation: [\n\t\t// placeholder data when creating a new reference (US Court Case is the only type that uses this)\n\t\t{\n\t\t\tid: uuidv4().toUpperCase(),\n\t\t\tpageNumber : '',\n\t\t\tseries : '',\n\t\t\tvolume : '',\n\t\t},\n\t],\n\tcity: '',\n\tcommitteeName: '',\n\tconference: '',\n\tcontent: '',\n\tcontributors: [],\n\tcountry: '',\n\tcourt: '',\n\tdatabase: '',\n\tdatabaseTitle: '',\n\tdescription: '',\n\tdistrict: '',\n\tdoi: '',\n\tedition: '',\n\tepisodeNumber: '',\n\tentry: '',\n\tentryTitle: '',\n\tepisodeTitle: '',\n\tfiledDate: '',\n\tformat: '',\n\tinstitution: '',\n\tissue: '',\n\tissueTitle: '',\n\tjournalTitle: '',\n\tkind: '',\n\tlocation: '',\n\tmagazineTitle: '',\n\tmedium: '',\n\tmodel: '',\n\tnewspaperTitle: '',\n\tnumber: '',\n\torderNumber: '',\n\toriginalArticleNumber: '',\n\toriginalArticleTitle: '',\n\toriginalBookTitle: '',\n\toriginalDoi: '',\n\toriginalEdition: '',\n\toriginalIssue: '',\n\toriginalJournalTitle: '',\n\toriginalMagazineTitle: '',\n\toriginalNewspaperTitle: '',\n\toriginalPublicationDate: '',\n\toriginalReferencePages: '',\n\toriginalVolume: '',\n\tpageNumber: '',\n\tpageNumbers: '',\n\tpageTitle: '',\n\tparagraph: '',\n\tparties: '',\n\tperiodical: '',\n\tplatform: '',\n\tproposedVolume: '',\n\tpublicationDate: '',\n\tpublishersV2: publishersDefault,\t// this is just the data holder, the format gets converted when it's sent to the engine\n\trecord: '',\n\treferencePages: '',\n\treferenceTitle: '',\n\trepealDate: '',\n\treportNumber: '',\n\tretractionIssue: '',\n\tretractionDate: '',\n\tretractionDoi: '',\n\tretractionPages: '',\n\tretractionUrl: '',\n\tretractionVolume: '',\n\tretrievalDate: '',\n\treviewedTitle: '',\n\trevisedDate: '',\n\truntime: '',\n\tseasonNumber: '',\n\tsection: '',\n\tsectionTitle: '',\n\tseries: '',\n\tseriesTitle: '',\n\tsession: '',\n\tsessionPart: '',\n\tshortTitle: '',\n\tsource: '',\n\tsourceLocation: '',\n\tsourceTitle: '',\n\tsponsor: '',\n\tstate: '',\n\tsymposiumTitle: '',\n\ttoggleSelect: toggleSelectDefault,\n\ttitle: '',\n\ttranslatedAnthologyTitle: '',\n\ttranslatedArticleTitle: '',\n\ttranslatedChapterTitle: '',\n\ttranslatedEntryTitle: '',\n\ttranslatedIssueTitle: '',\n\ttranslatedNewspaperTitle: '',\n\ttranslatedTitle: '',\n\ttranslatedVolumeTitle: '',\n\ttype: '',\n\turl: '',\n\tversion: '',\n\tvolume: '',\n\tvolumeTitle: '',\n\twebsite: '',\n\twebsiteTitle: '',\n\tworkTitle: '',\n\tworkType: '',\n}\n\nexport default {\n\tnamespaced: true,\n\n\tstate: {\n\t\t// non local storage states\n\t\tisCreateNextEnabled: false,\t// when creating a reference the next button can be turned on and off from other components\n\t\tisTranslator: false,\n\t\tformData: _cloneDeep(formDataDefault),\n\t\treferenceTypeId: 0,\t\t\t// selected ref type\n\t\treferenceTypeName: '',\t\t// selected ref name\n\t\trulesObjectData: [],\t// to replace the reference rules 'data' property\n\t\trulesObjectValues: {},\t// to replace the reference rules 'values' property\n\t},\n\n\tmutations: {\n\t\tPUSH_TO_CONTRIBUTORS(state, value){\n\t\t\tstate.formData.contributors.push(value);\n\t\t},\n\t\tPUSH_TO_CITATION(state, $opts){\n\t\t\tstate.formData.citation.push({\n\t\t\t\tid: $opts.id,\n\t\t\t\tpageNumber: $opts.pageNumber,\n\t\t\t\tseries: $opts.series,\n\t\t\t\tvolume: $opts.volume,\n\t\t\t});\n\t\t},\n\t\tPUSH_TO_PUBLISHERS(state, $opts){\n\t\t\tstate.formData.publishersV2[$opts.fieldType].push({\n\t\t\t\tcity: $opts.city,\n\t\t\t\tid: $opts.id,\n\t\t\t\tname: $opts.name,\n\t\t\t\tstate: $opts.state,\n\t\t\t});\n\t\t},\n\t\tREMOVE_CONTRIBUTOR_AT_INDEX(state, $opts){\n\t\t\tstate.formData.contributors.splice($opts.contributorIndex, 1);\n\t\t},\n\t\tREMOVE_CONTRIBUTOR_BY_ID(state, value){\n\t\t\tlet findThisContributorIndex = state.formData.contributors.findIndex((contributorData)=>{\n\t\t\t\treturn contributorData.id === value;\n\t\t\t});\n\t\t\tif(findThisContributorIndex != -1){\n\t\t\t\tstate.formData.contributors.splice(findThisContributorIndex, 1); \n\t\t\t}\n\t\t},\n\t\tREMOVE_CITATION_AT_INDEX(state, $opts){\n\t\t\tstate.formData.citation.splice($opts.citationIndex, 1);\n\t\t},\n\t\tREMOVE_PUBLISHER_AT_INDEX(state, $opts){\n\t\t\tstate.formData.publishersV2[$opts.fieldType].splice($opts.publisherIndex, 1);\n\t\t},\n\t\tRESET_FORM_DATA(state){\n\t\t\tstate.formData = _cloneDeep(formDataDefault);\n\t\t},\n\t\tSET_IS_CREATE_NEXT_ENABLED(state, value){\n\t\t\tstate.isCreateNextEnabled = value;\n\t\t},\n\t\tSET_IS_TRANSLATOR(state, value){\n\t\t\tstate.isTranslator = value;\n\t\t},\n\t\tSET_REFERENCE_TYPE_ID(state, value){\n\t\t\tstate.referenceTypeId = parseInt(value);\n\t\t},\n\t\tSET_REFERENCE_TYPE_NAME(state, referenceTypeName) {\n\t\t\tstate.referenceTypeName = referenceTypeName;\n\t\t},\n\t\tSET_RULES_OBJECT_DATA(state, value){\n\t\t\tstate.rulesObjectData = _cloneDeep(value);\n\t\t},\n\t\tSET_RULES_OBJECT_VALUES(state, value){\n\t\t\tstate.rulesObjectValues = value;\n\t\t},\n\t\tSORT_CITATION(state, $opts){\n\t\t\tstate.formData.citation.splice($opts.citationIndex, 0, state.formData.citation.splice($opts.oldIndex, 1)[0]);\n\t\t},\n\t\tSORT_CONTRIBUTORS(state, $opts){\n\t\t\tstate.formData.contributors.splice($opts.contributorIndex, 0, state.formData.contributors.splice($opts.oldIndex, 1)[0]);\n\t\t},\n\t\tSORT_PUBLISHERS(state, $opts){\n\t\t\tstate.formData.publishersV2[$opts.fieldType].splice($opts.publisherIndex, 0, state.formData.publishersV2[$opts.fieldType].splice($opts.oldIndex, 1)[0]);\n\t\t},\n\t\tUPDATE_CONTRIBUTOR_AT_INDEX(state, $opts){\n\t\t\tstate.formData.contributors[$opts.contributorIndex][$opts.key] = $opts.value;\n\t\t},\n\t\tUPDATE_FORM_DATA(state, $opts){\n\t\t\tstate.formData[$opts.key] = $opts.value;\n\t\t},\n\t\t\n\t\tUPDATE_CITATION_AT_INDEX(state, $opts){\n\t\t\tstate.formData.citation[$opts.citationIndex][$opts.key] = $opts.value;\n\t\t},\n\t\tUPDATE_PUBLISHER_AT_INDEX(state, $opts){\n\t\t\tstate.formData.publishersV2[$opts.fieldType][$opts.publisherIndex][$opts.key] = $opts.value;\n\t\t},\n\t\tUPDATE_TOGGLE_SELECT_CLEAR_UNSELECTED_OPTION(state, $opts){\n\t\t\tstate.formData.toggleSelect[$opts.groupName].options[$opts.unselectedOptionName].value = '';\n\t\t},\n\t\tUPDATE_TOGGLE_SELECT_AT_GROUP(state, $opts){\n\t\t\tstate.formData.toggleSelect[$opts.groupName].options[state.formData.toggleSelect[$opts.groupName].selectedOption].value = $opts.value;\n\t\t},\n\t\tUPDATE_TOGGLE_SELECT_SELECTED_OPTION(state, $opts){\n\t\t\tstate.formData.toggleSelect[$opts.groupName].selectedOption = $opts.selectedOption;\n\t\t},\n\t},\n\tactions: {\n\t\tdeepClear({commit}){\n\t\t\treturn new Promise((resolve)=>{\n\t\t\t\t// console.log('referenceRules.js > action > deepClear');\n\n\t\t\t\tcommit('RESET_FORM_DATA');\n\t\t\t\tcommit('SET_REFERENCE_TYPE_ID', 0);\n\t\t\t\tcommit('SET_RULES_OBJECT_DATA', []);\n\t\t\t\tcommit('SET_RULES_OBJECT_VALUES', {});\n\t\t\t\t\n\t\t\t\tresolve();\n\t\t\t});\n\t\t},//e:deepClear\n\n\t\t// preview is generated in another action, this one is called when user clicks a next or save button\n\t\tgenerateReference({commit, state}){\n\t\t\treturn new Promise((resolve)=>{\n\t\t\t\t// console.log('state.rulesObjectData');\n\t\t\t\t// console.log(state.rulesObjectData);\n\n\t\t\t\t// console.log('state.rulesObjectValues');\n\t\t\t\t// console.log(state.rulesObjectValues);\n\n\t\t\t\t// console.log(router.currentRoute.name);\n\n\t\t\t\tswitch(router.currentRoute.name){\n\t\t\t\t\t\n\t\t\t\t\tcase 'CreateGenesisReferenceStep2':\n\t\t\t\t\t\trouter.push({\n\t\t\t\t\t\t\tname:'CreateGenesisReferenceStep3',\n\t\t\t\t\t\t\tparams:{\n\t\t\t\t\t\t\t\topenReferenceTab: router.currentRoute.params.openReferenceTab,\n\t\t\t\t\t\t\t\treferenceTypeSlug: router.currentRoute.params.referenceTypeSlug\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'CreateStep3ThirdParty':\n\t\t\t\t\t\trouter.push({\n\t\t\t\t\t\t\tname:'CreateStep4ThirdParty'\n\t\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ConvertGenesisStep1':\n\t\t\t\t\t\trouter.push({\n\t\t\t\t\t\t\tname:'ConvertGenesisStep2',\n\t\t\t\t\t\t}).catch(()=>{});\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn resolve();\n\t\t\t});//e:Promise\n\t\t},//e:generateReference\n\n\t\tgenerateReferencePreview({commit, state}){\n\t\t\treturn new Promise((resolve)=>{\n\t\t\t\t// console.log('vuex store - generateReferencePreview');\n\n\t\t\t\t// i need to figure out which type of reference format to reutn to the preview\n\t\t\t\tlet _referenceFormatTypeId = HelperGetReferenceFormatId();\n\n\t\t\t\tcommit('SET_IS_CREATE_NEXT_ENABLED', false);\n\t\t\t\n\t\t\t\t// start a new blank object \n\t\t\t\tlet _collectedRefData = {};\n\t\t\t\t\n\t\t\t\t// console.log('state.formData');\n\t\t\t\t// console.log(state.formData);\n\n\t\t\t\t// loop through formData, find data entered for one field (ignore type and kind they will always have something)\n\t\t\t\t_forEach(state.formData, (value, key)=>{\n\t\t\t\t\tif(key !== 'contributors' && key !== 'type' && key !== 'kind' && key !== 'multifield'){\n\t\t\t\t\t\tif(value && value.length > 0){\n\t\t\t\t\t\t\tcommit('SET_IS_CREATE_NEXT_ENABLED', true);\n\t\t\t\t\t\t\treturn false;// only need to catch on\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t// collect each ref value and key\n\t\t\t\t_forEach(state.formData, (value, key)=>{\n\t\t\t\t\t// console.log(key);\n\t\t\t\t\t// console.log(value);\n\t\t\t\t\t// console.log('-');\n\t\t\t\t\tlet multiTextArray = [];\n\t\t\t\t\tlet cleanValue = value;\n\n\t\t\t\t\tswitch(key){\n\t\t\t\t\t\tcase 'articleNumber':\n\t\t\t\t\t\t\tif(_referenceFormatTypeId == config.enums.Format.MLA9 || (state.formData.kind !== 'advance' && state.formData.kind !== 'inPress' && state.formData.kind !== 'issue' && state.formData.type != 'database')){\n\t\t\t\t\t\t\t\t_collectedRefData['articleNumber'] = state.formData.toggleSelect.pagesArticle.options.articleNumber.value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_collectedRefData['articleNumber'] = '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'contributors':\n\t\t\t\t\t\t\t// console.log('contributors value');\n\t\t\t\t\t\t\t// console.log(value);\n\n\t\t\t\t\t\t\t_collectedRefData[key] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'originalArticleNumber':\n\t\t\t\t\t\t\tif(state.formData.type === 'reprinted'){\n\t\t\t\t\t\t\t\t_collectedRefData['originalArticleNumber'] = state.formData.toggleSelect.originalPagesArticle.options.originalArticleNumber.value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_collectedRefData['originalArticleNumber'] = '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'originalReferencePages':\n\t\t\t\t\t\t\tif(state.formData.type === 'reprinted'){\n\t\t\t\t\t\t\t\t_collectedRefData['originalReferencePages'] = state.formData.toggleSelect.originalPagesArticle.options.originalReferencePages.value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_collectedRefData['originalReferencePages'] = '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'publishersV2':\n\t\t\t\t\t\t\t// Assemble publishers v2\n\n\t\t\t\t\t\t\t// console.log('publishersV2');\n\t\t\t\t\t\t\t// console.log(value);\n\t\t\t\t\t\t\t_forEach(value, (arrayOfPublishers, publisherType)=>{\n\t\t\t\t\t\t\t\t// console.log('arrayOfPublishers');\n\t\t\t\t\t\t\t\t// console.log(arrayOfPublishers);\n\n\t\t\t\t\t\t\t\t_forEach(arrayOfPublishers, (publisherData)=>{\n\t\t\t\t\t\t\t\t\tmultiTextArray.push({\n\t\t\t\t\t\t\t\t\t\tcity: publisherData.city,\n\t\t\t\t\t\t\t\t\t\tname: publisherData.name,\n\t\t\t\t\t\t\t\t\t\tstate: publisherData.state,\n\t\t\t\t\t\t\t\t\t\ttype: publisherType,\n\t\t\t\t\t\t\t\t\t});\t\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif(state.referenceTypeId === 21){\n\t\t\t\t\t\t\t\t// Grants\n\t\t\t\t\t\t\t\t_collectedRefData['institution'] = multiTextArray;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_collectedRefData['publishers'] = multiTextArray;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// console.log(_collectedRefData['publishers']);\n\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'referencePages': // value has different types of content based on it's reference type\n\t\t\t\t\t\t\tif(state.referenceTypeId === 2 || state.referenceTypeId === 29){\n\t\t\t\t\t\t\t\t// Book || Newspaper\n\t\t\t\t\t\t\t\t_collectedRefData['referencePages'] = value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif(_referenceFormatTypeId == config.enums.Format.MLA9 || (state.formData.kind !== 'advance' && state.formData.kind !== 'inPress' && state.formData.kind !== 'issue' && state.formData.type != 'database')){\n\t\t\t\t\t\t\t\t\t_collectedRefData['referencePages'] = state.formData.toggleSelect.pagesArticle.options.referencePages.value;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t_collectedRefData['referencePages'] = '';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'retractionDoi':\n\t\t\t\t\t\t\t// console.log(value);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'toggleSelect':\n\t\t\t\t\t\t\t// break out the toggle select options\n\t\t\t\t\t\t\t_forEach(value, (toggleSelectData)=>{\n\t\t\t\t\t\t\t\t_forEach(toggleSelectData.options, (optionValue, optionKey)=>{\n\t\t\t\t\t\t\t\t\tif(optionKey !== 'pageNumbers' && state.referenceTypeId === 38) {\n\t\t\t\t\t\t\t\t\t\t// Reviews\n\t\t\t\t\t\t\t\t\t\t// referencePages is set as a text field for these two types, skip over it =\n\t\t\t\t\t\t\t\t\t} else if(optionKey === 'referencePages' && (state.referenceTypeId === 2 || state.referenceTypeId === 29)){\n\t\t\t\t\t\t\t\t\t\t// Book || Newspaper\n\t\t\t\t\t\t\t\t\t\t// referencePages is set as a text field for these two types, skip over it =\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tif(state.referenceTypeId === 26){\n\t\t\t\t\t\t\t\t\t\t\t// Magazine - passes the data with a different key\n\t\t\t\t\t\t\t\t\t\t\tif(optionKey === 'retractionDoi'){\n\t\t\t\t\t\t\t\t\t\t\t\t_collectedRefData['retractionDOI'] = optionValue.value;\n\t\t\t\t\t\t\t\t\t\t\t} else if(optionKey === 'retractionUrl'){\n\t\t\t\t\t\t\t\t\t\t\t\t_collectedRefData['retractionURL'] = optionValue.value;\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t_collectedRefData[optionKey] = optionValue.value;\t\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t_collectedRefData[optionKey] = optionValue.value;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'doi':\n\t\t\t\t\t\tcase 'url':\n\t\t\t\t\t\t\t// some reference data has url as a string instead of a toggleSelect value\n\t\t\t\t\t\t\tif(\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 3 || // Website\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 5 || // Advertisement\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 8 ||\t// Apparatus\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 9 ||\t// Artwork\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 10 ||\t// Bills & Resolutions\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 11 ||\t// Blog\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 12 ||\t// Charts, Infographics, & Maps\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 16 || // Dissertations & Theses\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 17 ||\t// Executive Orders\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 18 ||\t// Federal Testimony\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 19 || // Film & Movies\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 20 || // Government Reports\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 24 ||\t// International Conventions & Treaties\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 25 ||\t// Lectures\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 28 ||\t// Music\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 30 ||\t// Online Comment\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 32 ||\t// Patent\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 34 ||\t// Podcasts Radio\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 38 ||\t// Reviews\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 39 ||\t// SocialMedia\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 40 ||\t// Software\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 41 ||\t// Speech\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 42 ||\t// Statutes\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 44 ||\t// Tests & Scales\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 45 ||\t// US Federal Court\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 46 ||\t// State Court\n\t\t\t\t\t\t\t\tstate.referenceTypeId === 47 \t// Videos\n\t\t\t\t\t\t\t){\n\t\t\t\t\t\t\t\t_collectedRefData[key] = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t// console.log(key);\n\t\t\t\t\t\t\t// console.log(value);\n\t\t\t\t\t\t\t// replace any fancy quotes with normal ones, this will change what goes into the Engine, not the data field for this reference\n\t\t\t\t\t\t\t// https://stackoverflow.com/questions/9401312/how-to-replace-curly-quotation-marks-in-a-string-using-javascript\n\t\t\t\t\t\t\tif(typeof cleanValue === 'string'){\n\t\t\t\t\t\t\t\t_collectedRefData[key] = cleanValue.replace(/[\\u2018\\u2019]/g, \"'\").replace(/[\\u201C\\u201D]/g, '\"');\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_collectedRefData[key] = cleanValue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t});//e:forEach\n\t\t\t\t\n\t\t\t\t// console.log('_collectedRefData');\n\t\t\t\t// console.log(_collectedRefData);\n\t\t\t\t\n\t\t\t\tlet modeLevel = 'available';\t// start with available as the default\n\t\t\t\tif(config.isDev){\n\t\t\t\t\tmodeLevel = 'dev';\n\n\t\t\t\t} else if(config.isTest){\n\t\t\t\t\tmodeLevel = 'test';\n\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\tlet _values = Engine.getReference(state.referenceTypeId, _collectedRefData, modeLevel);\n\n\t\t\t\tcommit('SET_RULES_OBJECT_DATA', _collectedRefData);\n\t\t\t\tcommit('SET_RULES_OBJECT_VALUES', _values);\n\n\t\t\t\tresolve();\n\t\t\t});//e:Promise\n\t\t},//e:generateReferencePreview\n\t\t\n\t\t// called when leaving an active form, like when create ref starts, this should always be blank\n\t\tresetFormData({commit}){\n\t\t\treturn new Promise((resolve)=>{\n\t\t\t\t// console.log('action > resetFormData');\n\n\t\t\t\tcommit('SET_IS_TRANSLATOR', false);\n\t\t\t\tcommit('RESET_FORM_DATA');\n\n\t\t\t\tresolve();\n\t\t\t});//e:Promise\n\t\t},//e:resetFormData\n\n\t\troleDropdownChange({commit, dispatch, state}, $opts){\n\t\t\treturn new Promise((resolve)=>{\n\t\t\t\tcommit('SET_IS_TRANSLATOR', false);\n\t\n\t\t\t\t// clear all 3plu error states\n\t\t\t\t// _forEach(state.formData.contributors, (contributorData)=>{\n\t\t\t\t// \tcontributorData.is3pluErrorState = false;\n\t\t\t\t// });\n\t\t\t\t\n\t\t\t\t// check for any 3plu errors\n\t\t\t\t_forEach(state.formData.contributors, (contributorData)=>{\n\t\t\t\t\tcontributorData.is3pluErrorState = false;\n\t\t\t\t\tif(contributorData.type === 'chapterTranslator' || contributorData.type === 'translator'){\n\t\t\t\t\t\tcommit('SET_IS_TRANSLATOR', true);\n\t\t\t\t\t\treturn false;\t// exit, we just need 1 true\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tdispatch('generateReferencePreview').then(()=>{\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t\n\t\t\t});//e:Promise\n\t\t},\n\t},\n\n}","/*\n- Research Notes\n-- these all live under the reference, but extracting them here gives be easier\n-- ex: this.$store.state.researchNotes.x\n*/\n\nimport _has from 'lodash/has';\nimport store from '@/store';\n\nexport default {\n\tnamespaced: true,\n\n\tstate: {\n\t\t// local storage states\n\t\tactiveResearchNotes: [\t// tracks notes actually added to a paper, toggles in ResearchNoteRow of the Paper Editor Drawer\n\t\t\t//{\n\t\t\t//\tnoteId:\n\t\t\t//\tpaperGuid: \n\t\t\t//}\n\t\t],\n\n\t\tlist: [],\t// array: each element will be a modified object for each research note\n\t},\n\t\n\tmutations: {\n\t\tADD_TO_LIST(state, value){\n\t\t\tstate.list.push(value);\n\t\t},\n\n\t\tCLEAR_LIST(state){\n\t\t\tstate.list = [];\n\t\t},\n\t\t\n\t\tRESEACH_NOTE_ADD_ACTIVE(state, noteId){\n\t\t\tlet findIndex = state.activeResearchNotes.findIndex((researchNoteData)=>{\n\t\t\t\treturn researchNoteData.noteId === noteId;\n\t\t\t});\n\t\t\tif(findIndex === -1){\n\t\t\t\tstate.activeResearchNotes.push({\n\t\t\t\t\tnoteId: noteId,\n\t\t\t\t\tpaperGuid: store.state.paperGuid\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tRESEACH_NOTE_TOGGLE_ACTIVE(state, noteId){\n\t\t\tlet findIndex = state.activeResearchNotes.findIndex((researchNoteData)=>{\n\t\t\t\treturn researchNoteData.noteId === noteId;\n\t\t\t});\n\t\t\tif(findIndex === -1){\n\t\t\t\tstate.activeResearchNotes.push({\n\t\t\t\t\tnoteId: noteId,\n\t\t\t\t\tpaperGuid: store.state.paperGuid\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tstate.activeResearchNotes.splice(findIndex, 1);\t\n\t\t\t}\n\t\t},\n\t\t\n\t\tREMOVE_CITATION_BY_UNIQUE_ID(state, researchNoteUniqueId){\n\t\t\t// look up the index to remove by the research Note Unique Id\n\t\t\tlet findResearchNote = state.list.find((researchNoteData)=>{\n\t\t\t\treturn researchNoteData.genesisResearchNoteUniqueId.toUpperCase() === researchNoteUniqueId.toUpperCase();\n\t\t\t});\n\t\t\tif(findResearchNote){\n\t\t\t\tfindResearchNote.citation = '';\n\t\t\t\tfindResearchNote.citationOutput = '';\n\t\t\t}\n\t\t},\n\n\t\tREMOVE_BY_UNIQUE_ID(state, researchNoteUniqueId){\n\t\t\t// look up the index to remove by the research Note Unique Id\n\t\t\tlet findIndex = state.list.findIndex((researchNoteData)=>{\n\t\t\t\treturn researchNoteData.genesisResearchNoteUniqueId.toUpperCase() === researchNoteUniqueId.toUpperCase();\n\t\t\t});\n\t\t\tif(findIndex > -1){\n\t\t\t\tstate.list.splice(findIndex, 1);\n\t\t\t}\n\t\t},\n\n\t\tUPDATE_CITATION_BY_UNIQUE_ID(state, $opts){\n\t\t\t// look up the index to remove by the research Note Unique Id\n\t\t\tlet findResearchNote = state.list.find((researchNoteData)=>{\n\t\t\t\treturn researchNoteData.genesisResearchNoteUniqueId.toUpperCase() === $opts.researchNoteUniqueId.toUpperCase();\n\t\t\t});\n\n\t\t\tif(findResearchNote){\n\t\t\t\tif($opts.newCitationData === ''){\n\t\t\t\t\t// delete\n\t\t\t\t\tfindResearchNote.citation = '';\n\t\t\t\t\tfindResearchNote.citationOutput = '';\n\t\t\t\t} else {\n\t\t\t\t\tfindResearchNote.citation = JSON.stringify($opts.newCitationData);\n\t\t\t\t\t// assume APA7 for now\n\t\t\t\t\tif(_has($opts.newCitationData, 'apa7') && _has($opts.newCitationData.apa7, 'first') && $opts.newCitationData.apa7.first !== ''){\n\t\t\t\t\t\tfindResearchNote.citationOutput = $opts.newCitationData.apa7.first;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\n\t\tUPDATE_TEXT_BY_UNIQUE_ID(state, $opts){\n\t\t\t// look up the index to remove by the research Note Unique Id\n\t\t\tlet findResearchNote = state.list.find((researchNoteData)=>{\n\t\t\t\treturn researchNoteData.genesisResearchNoteUniqueId.toUpperCase() === $opts.researchNoteUniqueId.toUpperCase();\n\t\t\t});\n\t\t\tif(findResearchNote){\n\t\t\t\tfindResearchNote.note = $opts.newNoteText;\n\t\t\t}\n\t\t},\n\t\t\n\t},\n}\n","/*\n- Third Party Lookup\n-- accessed from ReferenceList > Create Modals / Reference Edit / Paper Edit > Create Drawers\n-- ex: this.$store.state.thirdPartyLookup.x\n*/\n\nexport default {\n\tnamespaced: true,\n\t\n\tstate:{\n\t\treferenceResults: [],\t// array of results from 3PLU\n\t\tsearchTerm: '',\t\t// String: term user searched for 3PLU\n\t},//e:state\n\n\tmutations: {\n\t\tREFERENCE_RESULTS(state, value) {\n\t\t\tstate.referenceResults = value;\n\t\t},\n\t\tSEARCH_TERM(state, value) {\n\t\t\tstate.searchTerm = value;\n\t\t},\n\t},//e:mutations\n}\n","import createPersistedState from 'vuex-persistedstate'; //https://github.com/robinvdvleuten/vuex-persistedstate\nimport Vue from 'vue';\nimport Vuex from 'vuex';\n\n// store modules\nimport api from './modules/api';\nimport cart from './modules/cart';\nimport classes from './modules/classes';\nimport customer from './modules/customer';\nimport forms from './modules/forms';\nimport freeTrial from './modules/freeTrial';\nimport gridSorts from './modules/gridSorts';\nimport loaders from './modules/loaders';\nimport references from './modules/references';\nimport referenceDuplicate from './modules/referenceDuplicate';\nimport referenceRules from './modules/referenceRules';\nimport researchNotes from './modules/researchNotes';\nimport thirdPartyLookup from './modules/thirdPartyLookup';\n\nVue.use(Vuex);\n\nexport default new Vuex.Store({\n\tstrict: process.env.NODE_ENV !== 'production',\n\tplugins: [createPersistedState({\n\t\t// array of states you want to keep in local storage\n\t\tpaths: [\n\t\t\t'api.sessionId',\n\t\t\t'api.token',\n\t\t\t'customer.email',\n\t\t\t'gridSorts.addFromLibraryIsByName',\n\t\t\t'hasCreatedPaper',\n\t\t\t'idToken',\n\t\t\t'lastSyncDate',\n\t\t\t'references.recentTypeIds',\n\t\t\t'openReferenceId',\n\t\t\t'redirectTo',\n\t\t\t'refLibCompString',\n\t\t\t'refLibCompStringGenesis',\n\t\t\t'showBetaFeatures',\n\t\t\t'researchNotes.activeResearchNotes',\n\t\t\t'researchNotes.list'\n\t\t]\n\t})],\n\t\n\tmodules: {\n\t\tapi,\n\t\tcart,\n\t\tclasses,\n\t\tcustomer,\n\t\tforms,\n\t\tfreeTrial,\n\t\tgridSorts,\n\t\tloaders,\n\t\treferences,\n\t\treferenceDuplicate,\n\t\treferenceRules,\n\t\tresearchNotes,\n\t\tthirdPartyLookup\n\t},\n\n\tstate: {\n\t\t// localStorage states\n\t\t// apiToken: '',\n\t\tidToken: '',\n\t\thasCreatedPaper: false,\n\t\tlastSyncDate: '', // returns from /Sync and is sent to back when new data is needed \n\t\topenReferenceId: '',\t// id of which ref is open (refs and cits view)\n\t\tredirectTo: '',\n\t\trefLibCompString: '',\t// compressed LZ-String of referenceLibrary array\n\t\trefLibCompStringGenesis: '',\t// compressed LZ-String of referenceLibraryGenesis array\n\t\tshowBetaFeatures: false,\t// uses impersonation and dev/test to show or hide beta features\n\t\t\n\t\t// non localStorage states\n\t\tcontributorsDataCopy: [],\t// array copy of data for contributors\n\t\tdocumentType: '',\n\t\tformatVersionID: 0,\t// sets when App.vue is mounted()\n\t\t\n\t\tiOS: false,\t\t\t// Word on iPad has special functionality - sets when App.vue is mounted()\n\t\tisSidebarOpen: false,\n\t\tpaperTypeID: 0,\t// sets when App.vue is mounted()\n\t\tpaperGuid: '',\n\t\treferenceLibrary: [],\t// no longer in localstorage\t\n\t\treferenceLibraryGenesis: [],\t// no longer in localstorage\t\n\t\treferenceTypeSearchTerm: '',\t// create ref step 1 > all ref types > search term\n\t\tshow3pluRedirectMessage: false,\n\t\tuseAdvancedMode: false,\n\t}, //e:state\n\n\n\tmutations: {\n\t\tcontributorsDataCopy(state, value) {\n\t\t\tstate.contributorsDataCopy = value;\n\t\t},\n\t\tformatVersionID(state, value) {\n\t\t\tstate.formatVersionID = value;\n\t\t},\n\t\tidToken(state, value) {\n\t\t\tstate.idToken = value;\n\t\t},\n\t\thasCreatedPaper(state, value) {\n\t\t\tstate.hasCreatedPaper = value;\n\t\t},\n\t\tiOS(state, value) {\n\t\t\tstate.iOS = value;\n\t\t},\n\t\tisSidebarOpen(state, value) {\n\t\t\tstate.isSidebarOpen = value;\n\t\t},\n\t\tLAST_SYNC_DATE(state, value) {\n\t\t\tstate.lastSyncDate = value;\n\t\t},\n\t\topenReferenceId(state, value) {\n\t\t\tstate.openReferenceId = value;\n\t\t},\n\t\tpaperTypeID(state, value) {\n\t\t\tstate.paperTypeID = value;\n\t\t},\n\t\tredirectTo(state, value) {\n\t\t\tstate.redirectTo = value;\n\t\t},\n\t\tREFERENCE_LIBRARY(state, value) {\n\t\t\tstate.referenceLibrary = value;\n\t\t},\n\t\tREFERENCE_LIBRARY_GENESIS(state, value) {\n\t\t\tstate.referenceLibraryGenesis = value;\n\t\t},\n\t\trefLibCompString(state, value) {\n\t\t\tstate.refLibCompString = value;\n\t\t},\n\t\trefLibCompStringGenesis(state, value) {\n\t\t\tstate.refLibCompStringGenesis = value;\n\t\t},\n\n\t\tREFERENCE_REMOVE_FROM_LIBRARY(state, referenceUniqueID){\n\t\t\tlet thisReferenceFindIndex = state.referenceLibraryGenesis.findIndex((reference)=>{\n\t\t\t\treturn reference.referenceUniqueID == referenceUniqueID\n\t\t\t});\n\t\t\tif(thisReferenceFindIndex != -1){\n\t\t\t\tstate.referenceLibraryGenesis.splice(thisReferenceFindIndex,1);\n\t\t\t}\n\t\t},//e:REFERENCE_REMOVE_FROM_LIBRARY\n\t\tREFERENCE_TYPE_SEARCH_TERM_SET(state, value) {\n\t\t\tstate.referenceTypeSearchTerm = value;\n\t\t},\n\t\tSET_DOCUMENT_TYPE(state, value) {\n\t\t\tstate.documentType = value;\n\t\t},\n\t\tSET_PAPER_GUID(state, value) {\n\t\t\tstate.paperGuid = value;\n\t\t},\n\t\tSET_SHOW_3PLU_REDIRECT_MESSAGE(state, value) {\n\t\t\tstate.show3pluRedirectMessage = value;\n\t\t},\n\t\tSHOW_BETA_FEATURES(state, value) {\n\t\t\tstate.showBetaFeatures = value;\n\t\t},\n\t\tuseAdvancedMode(state, value) {\n\t\t\tstate.useAdvancedMode = value;\n\t\t},\n\t\t\n\t}, //e:mutations\n});","var map = {\n\t\"./APA7-Advertisement.js\": 26887,\n\t\"./APA7-AncientClassicWork.js\": 88985,\n\t\"./APA7-Anthology.js\": 81499,\n\t\"./APA7-Apparatus.js\": 14507,\n\t\"./APA7-Artwork.js\": 47110,\n\t\"./APA7-BillsResolutions.js\": 54301,\n\t\"./APA7-Blog.js\": 80960,\n\t\"./APA7-Book.js\": 46425,\n\t\"./APA7-Brochures.js\": 20375,\n\t\"./APA7-ChartsMaps.js\": 43446,\n\t\"./APA7-ConferenceMaterials.js\": 71898,\n\t\"./APA7-Constitutions.js\": 52278,\n\t\"./APA7-Datasets.js\": 90793,\n\t\"./APA7-Dissertations.js\": 7602,\n\t\"./APA7-Engine.js\": 78166,\n\t\"./APA7-ExecutiveOrders.js\": 36389,\n\t\"./APA7-Films.js\": 80549,\n\t\"./APA7-Grants.js\": 64991,\n\t\"./APA7-GrayLiterature.js\": 57968,\n\t\"./APA7-InformalWorks.js\": 19900,\n\t\"./APA7-Interview.js\": 38529,\n\t\"./APA7-Journal.js\": 52093,\n\t\"./APA7-Lectures.js\": 93207,\n\t\"./APA7-Magazine.js\": 70494,\n\t\"./APA7-Manuscript.js\": 29344,\n\t\"./APA7-Music.js\": 7969,\n\t\"./APA7-Newspaper.js\": 15501,\n\t\"./APA7-OnlineComment.js\": 48106,\n\t\"./APA7-Patent.js\": 66002,\n\t\"./APA7-PersonalCommunication.js\": 66646,\n\t\"./APA7-PodcastsRadio.js\": 68158,\n\t\"./APA7-PressRelease.js\": 78520,\n\t\"./APA7-ReferenceWorks.js\": 66149,\n\t\"./APA7-Regulations.js\": 2371,\n\t\"./APA7-ReligiousWork.js\": 39540,\n\t\"./APA7-Reviews.js\": 64607,\n\t\"./APA7-Shared.js\": 85981,\n\t\"./APA7-SocialMedia.js\": 41711,\n\t\"./APA7-Software.js\": 7253,\n\t\"./APA7-SpecialRules.js\": 11014,\n\t\"./APA7-Speech.js\": 2334,\n\t\"./APA7-Statutes.js\": 7811,\n\t\"./APA7-Television.js\": 17452,\n\t\"./APA7-Testimonies.js\": 57744,\n\t\"./APA7-TestsScales.js\": 14188,\n\t\"./APA7-Treaties.js\": 89183,\n\t\"./APA7-USFederalCourtCases.js\": 48663,\n\t\"./APA7-USStateCourtCases.js\": 5423,\n\t\"./APA7-Videos.js\": 92212,\n\t\"./APA7-Webpage.js\": 70183\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 58500;","var map = {\n\t\"./MLA9-Advertisement.js\": 95315,\n\t\"./MLA9-AncientClassicWork.js\": 69581,\n\t\"./MLA9-Anthology.js\": 61599,\n\t\"./MLA9-Apparatus.js\": 36351,\n\t\"./MLA9-Artwork.js\": 24994,\n\t\"./MLA9-BillsResolutions.js\": 49905,\n\t\"./MLA9-Blog.js\": 55780,\n\t\"./MLA9-Book.js\": 33189,\n\t\"./MLA9-Brochures.js\": 10451,\n\t\"./MLA9-ChartsMaps.js\": 12562,\n\t\"./MLA9-ConferenceMaterials.js\": 78934,\n\t\"./MLA9-Constitutions.js\": 63066,\n\t\"./MLA9-Datasets.js\": 86437,\n\t\"./MLA9-Dissertations.js\": 50950,\n\t\"./MLA9-Engine.js\": 37210,\n\t\"./MLA9-ExecutiveOrders.js\": 56929,\n\t\"./MLA9-Films.js\": 99521,\n\t\"./MLA9-Grants.js\": 18195,\n\t\"./MLA9-GrayLiterature.js\": 29604,\n\t\"./MLA9-InformalWorks.js\": 27416,\n\t\"./MLA9-Interview.js\": 59573,\n\t\"./MLA9-Journal.js\": 69057,\n\t\"./MLA9-Lectures.js\": 29227,\n\t\"./MLA9-Magazine.js\": 7146,\n\t\"./MLA9-Manuscript.js\": 19244,\n\t\"./MLA9-Music.js\": 5,\n\t\"./MLA9-Newspaper.js\": 88129,\n\t\"./MLA9-OnlineComment.js\": 97782,\n\t\"./MLA9-Patent.js\": 35166,\n\t\"./MLA9-PersonalCommunication.js\": 67082,\n\t\"./MLA9-PodcastsRadio.js\": 22282,\n\t\"./MLA9-PressRelease.js\": 83148,\n\t\"./MLA9-ReferenceWorks.js\": 42673,\n\t\"./MLA9-Regulations.js\": 49967,\n\t\"./MLA9-ReligiousWork.js\": 24432,\n\t\"./MLA9-Reviews.js\": 87491,\n\t\"./MLA9-Shared.js\": 4217,\n\t\"./MLA9-SocialMedia.js\": 11755,\n\t\"./MLA9-Software.js\": 56361,\n\t\"./MLA9-SpecialRules.js\": 84778,\n\t\"./MLA9-Speech.js\": 64298,\n\t\"./MLA9-Statutes.js\": 57143,\n\t\"./MLA9-Television.js\": 7616,\n\t\"./MLA9-Testimonies.js\": 86988,\n\t\"./MLA9-TestsScales.js\": 80776,\n\t\"./MLA9-Treaties.js\": 47915,\n\t\"./MLA9-USFederalCourtCases.js\": 50699,\n\t\"./MLA9-USStateCourtCases.js\": 38643,\n\t\"./MLA9-Videos.js\": 99248,\n\t\"./MLA9-Webpage.js\": 50043\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 92168;","var map = {\n\t\"./Turabian9-Advertisement.js\": 60055,\n\t\"./Turabian9-AncientClassicWork.js\": 9577,\n\t\"./Turabian9-Anthology.js\": 39947,\n\t\"./Turabian9-Apparatus.js\": 48795,\n\t\"./Turabian9-Artwork.js\": 35510,\n\t\"./Turabian9-BillsResolutions.js\": 70573,\n\t\"./Turabian9-Blog.js\": 29424,\n\t\"./Turabian9-Book.js\": 80105,\n\t\"./Turabian9-Brochures.js\": 63431,\n\t\"./Turabian9-ChartsMaps.js\": 59910,\n\t\"./Turabian9-ConferenceMaterials.js\": 64074,\n\t\"./Turabian9-Constitutions.js\": 35398,\n\t\"./Turabian9-Datasets.js\": 54649,\n\t\"./Turabian9-Dissertations.js\": 59810,\n\t\"./Turabian9-Engine.js\": 3526,\n\t\"./Turabian9-ExecutiveOrders.js\": 73781,\n\t\"./Turabian9-Films.js\": 56373,\n\t\"./Turabian9-Grants.js\": 16815,\n\t\"./Turabian9-GrayLiterature.js\": 81248,\n\t\"./Turabian9-InformalWorks.js\": 23884,\n\t\"./Turabian9-Interview.js\": 96529,\n\t\"./Turabian9-Journal.js\": 11661,\n\t\"./Turabian9-Lectures.js\": 71271,\n\t\"./Turabian9-Magazine.js\": 63054,\n\t\"./Turabian9-Manuscript.js\": 26224,\n\t\"./Turabian9-Music.js\": 1489,\n\t\"./Turabian9-Newspaper.js\": 9757,\n\t\"./Turabian9-OnlineComment.js\": 35354,\n\t\"./Turabian9-Patent.js\": 9730,\n\t\"./Turabian9-PersonalCommunication.js\": 30982,\n\t\"./Turabian9-PodcastsRadio.js\": 6414,\n\t\"./Turabian9-PressRelease.js\": 60456,\n\t\"./Turabian9-ReferenceWorks.js\": 64725,\n\t\"./Turabian9-Regulations.js\": 19315,\n\t\"./Turabian9-ReligiousWork.js\": 50148,\n\t\"./Turabian9-Reviews.js\": 93423,\n\t\"./Turabian9-Shared.js\": 16973,\n\t\"./Turabian9-SocialMedia.js\": 84799,\n\t\"./Turabian9-Software.js\": 30629,\n\t\"./Turabian9-SpecialRules.js\": 3030,\n\t\"./Turabian9-Speech.js\": 19118,\n\t\"./Turabian9-Statutes.js\": 10035,\n\t\"./Turabian9-Television.js\": 95100,\n\t\"./Turabian9-Testimonies.js\": 32096,\n\t\"./Turabian9-TestsScales.js\": 68156,\n\t\"./Turabian9-Treaties.js\": 85423,\n\t\"./Turabian9-USFederalCourtCases.js\": 38535,\n\t\"./Turabian9-USStateCourtCases.js\": 93215,\n\t\"./Turabian9-Videos.js\": 74404,\n\t\"./Turabian9-Webpage.js\": 6199\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 52248;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"564\":\"ChunkDocumentCreates\",\"607\":\"ChunkCore\",\"748\":\"ChunkReferences\",\"808\":\"ChunkCart\"}[chunkId] || chunkId) + \".\" + {\"98\":\"b0f77c4c10a92c405799\",\"135\":\"45d2f0b54918c1c27561\",\"203\":\"eb606bdceb250263c913\",\"564\":\"4a7f42d938e811221b04\",\"607\":\"1092ee3ecf4a0b7366f6\",\"671\":\"dee93beaddf8759811e1\",\"748\":\"920c9507e872ffa55d96\",\"808\":\"886c4f5c974cd9209791\",\"837\":\"5fcd80f01ede04aad728\",\"990\":\"c547cacf41f6cf7b6af5\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + {\"564\":\"ChunkDocumentCreates\",\"607\":\"ChunkCore\",\"748\":\"ChunkReferences\",\"808\":\"ChunkCart\"}[chunkId] + \".\" + {\"564\":\"a5068c85d0226190890f\",\"607\":\"0cc2ef29486a970e23be\",\"748\":\"fce5fd1e673caf0f21d8\",\"808\":\"9a46c7c98bd93869bf32\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"564\":1,\"607\":1,\"748\":1,\"808\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkperrla_word\"] = self[\"webpackChunkperrla_word\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [528], function() { return __webpack_require__(52270); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","AccountRole","AddFromLibraryMode","CartPaymentType","CitationTab","CkEditorType","ClassColors","DocumentType","DownloadPaperContentType","Entity","Error","FontFamily","Format","Layout","Module","ModuleOrigin","PaperType","Platform","RefTypeTab","ResearchNotesSortBy","Status","SubscriptionPeriod","SubscriptionRenewalPeriod","SubscriptionRenewalType","Tab","Theme","URL_TO_ENV","Validation","WorkType","isDev","isTest","isLive","appUrl","window","location","origin","includes","todayDate","Date","setHours","enums","emptyText","forceResyncBeforeDate","platformId","ADD_IN","today","usePendo","useErrorLogger","config","ONLINE","CHROME_EXT","store","state","formatVersionID","console","log","APA7","router","currentRoute","meta","module","REFERENCE_LIST","REFERENCE_EDIT","references","displayFormatVersionId","PAPER_EDIT","paperEdit","PaperFormatVersionID","addCustomProp","$opts","Promise","resolve","reject","Word","run","context","document","properties","customProperties","add","key","value","sync","then","canSetDocProps","Office","platform","diagnostics","version","substr","getAllCustomProps","docProps","load","returnProps","items","forEach","item","getCustomProp","propName","docPropsObject","getItemOrNullObject","useAdvancedMode","useNewCitationMode","getDocProp","setCustomProp","setDocProp","render","_vm","this","_c","_self","class","showBetaFeatures","attrs","_v","staticClass","_withStripped","name","directives","rawName","isShown","expression","role","$platformId","$enums","to","type","on","click","$event","preventDefault","fullLogout","apply","arguments","_e","props","loaderId","required","String","methods","AS_FullLogout","$router","push","catch","computed","$store","loaders","showArray","open","isSidebarOpen","href","closeMenu","title","showDevTools","setShowBetaFeatures","iOS","documentType","RESEARCH_PAPER","APA6","ANNOTATED_BIBLIOGRAPHY","target","rel","$isLive","customer","isImpersonating","get","set","newValue","commit","ref","isOpen","domProps","innerHTML","_s","body","length","buttonType","buttonText","data","isSticky","created","emitter","$nextTick","toasterHeight","$refs","toasterWrp","clientHeight","style","bottom","setTimeout","destroyed","off","mounted","MSInputMethodContext","documentMode","AS_InitTooltips","browser","detect","os","_forEach","s","r","cs","test","navigator","userAgent","osVersion","exec","onerror","message","source","line","column","error","$rollbar","group","groupEnd","newrelic","noticeError","matchMedia","matches","documentElement","setAttribute","_unused","$gtag","linker","WordDocProps","APA7_AnnotatedBibliography","MLA9_AnnotatedBibliography","Turabian9_AnnotatedBibliography","APA_DiscussionPost","APA7_DiscussionPost","MLA_DiscussionPost","MLA9_DiscussionPost","Turabian9_DiscussionPost","DISCUSSION_POST","APA7_ReferenceList","MLA9_ReferenceList","Turabian9_ReferenceList","components","LoaderComponent","Sidemenu","Toaster","Vue","use","VueDebounce","mitt","VERSION","prototype","Rollbar","accessToken","captureUncaught","captureUnhandledRejections","enabled","environment","filterTelemetry","e","subtype","url","indexOf","hostSafeList","ignoredMessages","payload","client","code_version","source_map_enabled","verbose","errorHandler","vm","info","directive","inserted","el","focus","RegExp","parsedHtml","DOMParser","parseFromString","aElements","getElementsByTagName","newUrl","decodeURIComponent","getAttribute","trim","replace","update","_unused2","$isDev","$isTest","$version","clientStrings","id","OSVersionOutput","$browser","$browserVersion","$os","$osVersion","$sourceApp","$sourceAppVersion","VueGtag","globalObjectName","params","send_page_view","onReady","_has","requirements","isSetSupported","$vm","createEL","App","$mount","getElementById","display","component","path","hideZendesk","isPaperCreate","paperTypeEnum","redirect","APA7_StudentPaper","Turabian9_ResearchPaper","requiresPerrla","cleanCopyRedirect","VueRouter","routes","cart","documentCreates","beforeEnter","from","next","query","access_token","localStorage","setItem","id_token","redirectTo","redirectTemp","requiresAuth","reference","beforeEach","onLine","matched","some","record","hasCreatedPaper","api","token","dateObj","expirationDate","isBefore","$route","allProps","PERRLAExportAsNormal","ConvertedToSimple","errorType","afterEach","emit","scrollTo","isRejectWithMessage","makeTheApiCall","_contentType","contentType","_ignoreAuth","ignoreAuth","_outsideSpa","outsideSpa","_responseType","responseType","requestParams","cache","method","sourceAppOutput","wordVersionOutput","_url","headerObject","browserName","browserVersion","customerId","organizationExpirationDate","organizationId","organizationStatusId","osName","sessionId","isHardUrl","URL","_merge","search","URLSearchParams","headers","Headers","JSON","stringify","fetch","Request","response","ok","arrayBuffer","json","text","status","responseError","statusText","Swal","buttonsStyling","icon","confirmButtonText","showCloseButton","showConfirmButton","customClass","confirmButton","result","responseData","handleErrorAtSource","messageOutput","code","failReasonDisplay","allowOutsideClick","failReason","AS_CheckToken","apiToken","clonedOpts","errorText","dispatch","passToken","getItem","removeItem","newGUID","uuidv4","toUpperCase","setCustomAttribute","chrome","storage","local","_isEmpty","shared","require","exports","getReference","refData","getStringValue","kind","orderByValue","getOrderByValue","isPrintedOnReferencePage","getCitation","citationData","first","subsequent","referenceValue","datePart","publicationDate","getFullDate","getDatePart","sourcePart","publisherString","getPublisherString","publishers","authorArray","getAuthors","contributors","authorString","getReferenceNameString","doi","appendDOIURL","formatURL","publicationDateOriginal","originalPublicationDate","getSourcePart","authorPart","endsWith","editorArray","getEditors","getEditorsAtStartofRefString","getAuthorPart","titlePart","bookTitle","italicize","translatedTitle","editorString","translatorString","getTranslatorString","editorTranslatorString","getEditorTranslatorString","edition","isFirstNames","fixEditionString","fixTitlePartClosure","getTitlePart","paperRefs","getCitationAuthorString","year","getYear","toTitleCase","getCitations","refAuthorPart","wholeAuthorPart","getWholeAuthorPart","anthologyTitle","translatedAnthologyTitle","entrySourcePart","pageNumbers","normalSourcePart","formatPageNumbers","getEntrySourcePart","entryTitlePart","entryTitle","translatedEntryTitle","getEntryTitlePart","model","label","fixPageDash","formattedDate","city","country","substring","format","startsWith","upperFirstLetter","stripSubtitle","billNumber","session","volume","pageNumber","getOrdinalValue","getEnactedSenate","getEnactedHouse","getUnenactedSenate","getUnenactedHouse","shortTitle","retrievalDate","formatRetrievalDate","blogTitle","appendData","array","split","getBookEditorPart","translatorArray","getTranslators","chapterTranslatorArray","getChapterTranslators","getBookTitlePart","bookTitlePart","seriesTitle","volumeTitle","seriesVolumeTitle","narratorString","getNarratorString","referencePages","editionPart","getBookSourcePart","bookSourcePart","refDatePart","trimSubtitle","removeEmptyContributors","getVolumeEditors","illustratorString","getIllustratorString","narratorArray","lastName","firstName","middleName","suffix","chapterAuthorPart","getChapterAuthorPart","chapterTitlePart","chapterTitle","translatedChapterTitle","getChapterTranslatorString","addClosure","getChapterTitlePart","chapterSourcePart","bookEditorPart","originalBookSourcePart","bookTitleOriginal","originalBookTitle","originalPages","originalEditorString","getOriginalEditorString","originalPublisherString","getOriginalPublisherString","getOriginalBookSourcePart","getChapterSourcePart","chapterJournalSourcePart","originalJournalSourcePart","articleTitle","journalTitle","issue","originalDoi","originalUrl","getOriginalJournalSourcePart","getChapterJournalSourcePart","description","endDate","getFullDateRange","chairArray","getChairs","chairString","symposiumTitle","conference","formatSectionString","section","prefix","formatPargraphString","paragraph","article","amendment","repealDate","charterArticle","institution","database","getTypeEngine","citation","orderNumber","addCommasToNumber","getCustomNameLabel","contributor","customLabel","contributorstring","getReferenceName","counter","getFilmReferenceNameString","fixTimeCitationData","join","institutionString","workTitle","seriesTitlePart","getSeriesTitlePart","getContributorsByType","number","getInitial","getReverseCitationAuthorString","getReverseFullDate","namePart","firstCitation","getCitationLocationString","translatedArticleTitle","articleNumber","secondaryContribs","retractedSourcePart","retractionDate","retractionJournal","retractionVolume","retractionIssue","retractionPages","retractionURL","retractionDOI","retractionArticleNumber","getRetractedSourcePart","reprintedSourcePart","originalArticleTitle","originalJournalTitle","originalVolume","originalIssue","getReprintedSourcePart","sectionTitlePart","sectionTitle","translatedSectionTitle","issueTitle","translatedIssueTitle","getSectionTitlePart","databaseTitle","getDatabaseTitlePart","magazineTitle","retractionMagazine","originalMagazineTitle","editorLabel","manuscriptLabel","albumTitle","songTitle","groupPerformerString","getGroupPerformerString","performerArray","getPerformers","performerString","newspaperTitle","retractionTitle","originalNewspaperTitle","content","limitWordsInString","titleArray","i","archiveName","getPodcastReferenceNameString","typeCount","isSecondary","getReverseCitationName","getNameLabel","plural","cleanedDate","filteredContribs","typeAdded","episodeTitle","episodeNumber","isInteger","episodeSourcePart","getEpisodeSourcePart","usingEpisodeTitle","referenceTitle","wikiSourcePart","getWikiSourcePart","reportNumber","proposedVolume","proposedDate","proposedYear","publicationDateInput","publicationYearOnly","match","subsequentCitation","contributorCounter","hasSubsequent","abbreviation","getReviewArtists","contribArray","getLabelForContributorType","getTVReferenceNameString","writerArray","directorArray","writerDirectorArray","customArray","authorCount","thisName","thisLabel","namesUsed","appendNameSeperator","isPlural","nameString","periodical","getPeriodicalSourcePart","website","getWebsiteSourcePart","blog","getBlogSourcePart","reviewedTitle","reviewAuthors","getReviewAuthors","secondaryContribsString","reviewContribs","getReviewFilmContribs","getFilmTitlePart","getAlbumTitlePart","getSongTitlePart","getTVSeriesTitlePart","getTVEpisodeTitlePart","getReviewComposers","workType","slice","getOtherTitlePart","dateHelper","getEditorAtStartString","authors","isSubsequent","getCitationName","isSpecial","isSpecialMiddleName","middleArray","middleInitial","firstInitial","userName","groupName","contributorname","contribCount","thisReference","foundForThisRef","thisContributor","thisContribFirstInitial","input","output","citationVolume","getCitationVolume","usePluralLabel","pages","cleanPages","isNaN","parseInt","Number","convertNumberToText","num","th","dg","tn","tw","toString","parseFloat","x","n","str","sk","y","j","k","removingLeadingZeros","date","month","day","getYearFromDate","getMonthFromDate","getDayFromDate","cleanContributors","removeEmptyPublishers","cleanPublishers","publisher","foundSomething","errorConverting","toLowerCase","yearArray","err","refPublishers","performersArray","editors","illustratorArray","same","thisEditor","found","thisTranslator","originalEditorArray","originalPublisherArray","words","inItalics","bracketlessArray","inBrackets","removeTags","dateArray","fromCharCode","startDate","fullDate","startYear","startMonth","startDay","endYear","endMonth","endDay","subsequentAuthorString","dataArray","wordCount","limitedValue","valueArray","matchSimilarTypes","typeContribs","attachment","getPostTitlePart","getPageTitlePart","getForumTitlePart","entry","ignoreLabel","_cloneDeep","groupedCitations","groupCitationIds","thisRef","undefined","citations","Array","isArray","thisCitation","groupUniqueID","thisGroupCitationID","thisGroupID","groupCitations","groupValue","lastRefAuthorPart","lastCitationUsed","thisDisplay","displayValue","displayToUse","apa7","commaSplit","thisChar","charAt","sameAuthorDateParts","sameAuthorDatePartID","sameAuthorDatePartIDs","foundMatches","innerReference","referenceUniqueID","indirectCitation","thisSameID","matchingRefs","refsToOverwrite","hasAnExactMatch","alreadyFound","refDataObject","parse","innerRefDataObject","smallContribCount","totalContribCount","addEtAl","endMatches","innerFirstInitial","includeAmpersand","overwrite","getCitationEtAlOverwrite","citationEtAlOverwrite","splitArray","pop","existingAuthorPart","newDatePart","suffixToAdd","refsDate","citationDate","orderRefs","sort","a","b","textA","textB","specialRules","_references","engineRef","_thisReference","typeEngine","typeData","typeShortName","refTypes","thisType","shortname","getTypeShortName","referenceTypeID","Object","startBracket","endBracket","revisedDate","getFederalUSCReference","getFederalPLReference","sourceTitle","sourceLocation","getStateReference","getSeriesAuthorPart","executiveProducerArray","executiveDirectorArray","executiveDirectorProducerArray","seriesDatePart","getSeriesDatePart","seriesSourcePart","getSeriesSourcePart","seriesAuthorPart","episodeDatePart","getEpisodeDatePart","secondaryContributorString","episodeAuthorPart","getEpisodeAuthorPart","episodeTitlePart","seasonNumber","getEpisodeTitlePart","committeeName","contributorString","getSeriesAbbreviation","series","circuit","district","seriesAbbreviation","appealedLabel","appealVolume","appealSeries","appealPageNumber","appealDate","appealCircuit","citationString","getCitationString","court","bracket","editorsUsedInAuthorPart","pageTitle","websiteTitle","replaceAll","apa7engine","apa7specialrules","mla9engine","mla9specialrules","turabian9engine","turabian9specialrules","canExecuteFormat","executingMode","modeLevels","executingLevel","typeLevel","typeMode","formats","mode","runAPA7","runMLA9","runTurabian9","mla9","turabian9","returnReferences","referenceObject","parsedRefData","contributorPropertyNames","values","getCitationTitle","citationTitle","replaceAmpersand","getCitationDate","primaryInfo","primaryPart","removeDescriptionFromTitle","doubleQuote","sponsor","fixClosure","getPrimaryInformation","firstSupplemental","getFirstSupplemental","containerOne","container1","getContainerOne","containerTwo","container2","getContainerTwo","secondSupplemental","getSecondSupplemental","primaryContributor","getPrimaryContributorString","authorPartNoLabel","authorPartSort","getPrimaryContributorSort","fakeRefData","getPrimaryContributorCitationString","formatOriginalPublicationDate","secondaryContributor","getSecondaryContributorString","urlDoiOutput","titleProperty","isSecondaryTitle","pubDateLabel","getGroupAuthorMatchBlogTitle","primaryContributorMinusLastCharacter","isGroupAuthorMatchBlogTitle","supplementalContributors","getFirstSupplementalContributorString","volumeClosure","volumeEditors","getSecondaryContributorTypeString","fixFormatString","originalEditors","seriesEditors","seriesEditorString","getConferenceDateRange","getLocation","secondaryContributors","typeStrings","typeString","word","conversions","index","stateAbbreviationToFull","extraSuffix","author","getSecondaryReferenceName","getPrimaryCustomContributorString","directorContributors","getMonthYear","customContribs","fakeRefDate","primaryRefContributor","abbreviate","originalInfo","hasTitle","retractionInfo","retractionUrl","retractionDoi","isDescription","medium","ignoreFormat","hasEditorsOnly","editorOnly","contrib","editorsOnly","translators","groupAuthor","allContribs","reviewEditors","directors","writers","writerDirectors","artists","reviewComposers","reviewGroupArtists","excludeRole","primaryOverride","primaryType","getPrimaryContributorType","pluralLabel","primaryContributors","contributorLabel","getCustomContributorLabel","middleNameString","shortenGroupName","prepositions","subtitleArray","shortName","foundPrep","foundNonPrep","isPrep","part","punctuation","urlText","addLabel","isCitation","shortenPageNumber","hasPlus","removeLastCharacter","contribString","labelOne","labelTwo","contributorOnestring","contributorTwostring","contribStringArray","noTitleFormatting","illustrators","narrators","performers","groupPerformers","executiveProducers","editorTranslators","getEditorTranslators","testimonies","contributorType","monthYear","dashArray","spaceArray","fullDateRange","timeArray","newTimeFormat","newItem","citationValue","titleCitation","shortenName","dateCitation","withTitle","withDate","trimmed","abbreviations","sentence","newSentence","thisWord","thisAbbreviation","thisWordToAbbr","ordinalToWord","ordinal","formatTitle","descriptionOnly","sameAuthorParts","sameAuthorPartID","sameAuthorPartIDs","sameAuthorPartEtAlID","sameAuthorPartEtAlIDs","foundEtAlMatches","dashReplacement","hasDuplicateTitlesAlso","citationShortTitle","contribTypes","alreadyInList","contribType","contribsByType","getEpisodeContainerOneContribs","executiveDirectors","executiveDirectorProducers","getEpisodeContainerTwoContribs","season","episode","districtAbbreviationToFull","courtAbbreviationToFull","seriesAbbreviationToFull","noFormatting","pubsItalics","fakeTitle","primaryReferenceContributor","citationRefData","publicationPart","getPublicationPart","getAuthorPartSort","citationDefaultShortTitle","firstInfo","subsequentInfo","getCitationAuthorPart","fixFormatStringForCitation","lowerFirstLetter","citationLocation","parseTimeStampString","subsequentSponsor","subsequentTitle","locationPart","getLocationPart","getSecondaryContributorCitationString","publisherPart","publisherLocationString","parenthesis","subsequentAuthorPart","isSelfPublished","workTitleSubsequent","authorPartRepeat","getPublisherStringInverted","sessionPart","isAuthorAndBlogTitleEqual","replaceWithAbbreviations","checkBlogTitle","removeBrackets","isGenericChapterTitle","isGeneric","isTranslated","isTrans","chapterTranslators","getEditorTypeString","getSeriesEditors","volumeSeperator","seriesVolumeText","originalPublicationDateYear","isPublisherAndAuthorSame","isWorkTitleBlank","subsequentWorkTitle","hasNonChairContributors","has","chairs","hasNonOtherContribs","chairsString","parenthesisPart","convertRomanNumerals","rangeArray","outputString","romanHash","I","V","X","L","C","D","M","singleRange","accumulator","retrievalDatePart","useDescriptionForTitle","getCustomContributorString","seperator","getDirectors","customs","directorsString","actorContribs","getCustomContributorByName","producerContribs","writerContribs","hostContribs","narratorContribs","otherContribs","actorsString","producerString","writerString","hostString","customString","names","namedContribs","contributorPart","getContributorPart","runtime","formattedRunTime","formatRunTime","isSelf","customLowerCase","getInterviewEditorString","translatedWorkTitle","getPerformerString","recordDate","useTitle","hasContribs","originalAuthorContribs","filedDate","getContriutorByType","typeToGet","returnContributors","getHostString","hosts","returnHostString","getInterviewerString","interviewArray","interviewString","hostsString","executiveProducersString","isDescriptionUsedForTitle","workTitleInterview","shortWorkTitle","shortEpisodeTitle","isOnlyEditorsInEntry","returnValue","isAnyAuthors","isOnlyEditorsInEntryValue","isAnyAuthorsValue","getSecondaryContributorCitationTypeString","referenceTitleSubsequent","subsequetWorkTitle","getContributorLabel","citationLocationPunctuation","ordinalToNumber","canBePrimary","useLeadingCustomName","useEtAl","customName","getCleanPublisherName","cleanName","removalWord","getPrimaryType","groupAuthorsAsAuthors","splice","seperateWithComma","omitGroupAuthors","firstLocation","subsequentLocation","getGroupAuthorCitationString","groupAuthorString","groupAuthors","verifyLocation","cleanNames","publishersString","noPubLocation","timeStringIn","contributorBlock","publisherBlock","time","isEntryDesctiption","numberA","createOrder","numberB","matchingShortNames","filter","obj","matchingShortName","matchingShortNameRefs","matchingShortNameRef","expandShortName","fullName","newShortName","restOfShortName","trimStart","done","isContinue","copyrightYear","sectionStringOutput","sectionOutput","directorContribs","writerDirectorContribs","directorProducerContribs","useCombinedWriterDirector","useCombinedDirectorProducer","directorString","directorProducerString","writerDirectorString","customContribString","contribPart","channel","parties","appealAbbreviation","appealCircuitPart","circuitPart","districtPart","courtPublicationDatePart","preText","descriptionAsTitle","getCitationTitlePart","pagetitle","getCitationPublicationPart","getCitationLocationPart","subsequentTitlePart","getSubsequentCitationTitlePart","formatRequested","pad","val","len","i18n","dayNames","monthNames","d","getDate","dd","ddd","getDay","dddd","m","getMonth","mm","mmm","mmmm","yy","getFullYear","yyyy","$0","nameArray","secondPart","ignorePunctuation","newText","lowers","uppers","previousWord","thisWordToCheck","thisWordPrefix","isLower","isUpper","isAbbreviation","isHyphenated","hyphenArray","leaveLower","string","isForeign","domain","parts","startsWithDQuote","endsWithDQuote","startsWithSQuote","endsWithSQuote","lowerText","isUpperCase","strReplace","strWith","esc","reg","namespaced","mutations","SET_BROWSER_NAME","SET_BROWSER_VERSION","SET_CUSTOMER_ID","SET_OS_NAME","SET_OS_VERSION","SET_SESSION_ID","SET_TOKEN","taxRateTN","annualSubscriptionPrice","chargeTax","currentExpirationDate","discount","grandTotal","isAutomated","isRenewal","isSuccessful","paymentMethod","prioritySupport","products","promotionalCode","prices","purchaseAttempts","referringCustomerId","renewalPeriod","renewalType","shoppingCartUserId","subTotal","tax","zipCode","proRatedPrioritySupportPrice","purchaseId","transactionId","subTotalDisplay","accountNumber","accountType","bankName","cardNumber","creditCardType","expirationDateOutput","expirationMonth","expirationYear","isNonUsAddress","paymentTypeId","CARD","routingNumber","verificationCode","CLEAR_PAYMENT_METHOD","CLEAR_PRODUCTS_ARRAY","PUSH_TO_PRODUCTS_ARRAY","SET_ANNUAL_SUBSCRIPTION_PRICE","SET_CHARGE_TAX","SET_CURRENT_EXPIRATION_DATE","SET_DESCRIPTION","SET_DISCOUNT","SET_GRAND_TOTAL","SET_IS_AUTOMATED","SET_IS_RENEWAL","SET_IS_SUCCESSFUL","SET_PAYMENT_METHOD","SET_PRIORITY_SUPPORT","SET_PRO_RATED_PRIORITY_SUPPORT_PRICE","SET_PRODUCTS","SET_PROMOTIONAL_CODE","SET_PRICES","SET_PURCHASE_ATTEMPTS","SET_PURCHASE_ID","SET_REFERRING_CUSTOMER_ID","SET_RENEWAL_PERIOD","SET_RENEWAL_TYPE","SET_SHOPPING_CART_USER_ID","SET_SUBTOTAL","SET_SUBTOTAL_DISPLAY","SET_TAX","SET_TRANSACTION_ID","SET_ZIP_CODE","SET_ACCOUNT_NUMBER","SET_ACCOUNT_TYPE","SET_BANK_NAME","SET_CARD_NUMBER","SET_CREDIT_CARD_TYPE","readValue","SET_EXPIRATION_DATE_OUTPUT","SET_EXPIRATION_MONTH","SET_EXPIRATION_YEAR","SET_FIRST_NAME","SET_LAST_NAME","SET_IS_PRIORITY_SUPPORT","SET_IS_NON_US_ADDRESS","SET_PAYMENT_TYPE_ID","SET_ROUTING_NUMBER","SET_VERIFICATION_CODE","actions","assembleObject","_ref","isCreditCard","ECHECK","paymentMethodName","cardType","padStart","nameOnCard","paymentMethodID","paymentTypeID","padEnd","customerID","referringCustomerID","shoppingCartUserID","getNewCart","_ref2","ApiS_MakeCall","ANNUAL","AUTO","updateCartTotals","_ref3","rootState","_isPrioritySupportOnly","isPrioritySupportOnly","calcSubTotal","SEMI","calcTaxApplied","Math","round","prioritySupportAnnualSubscription","semiAnnualSubscription","prioritySupportSemiAnnualSubscription","discountAmount","codeType","discountPercent","dollarDiscount","addMonths","epirationDateOutput","dateFormat","list","openObject","SET_OPEN_OBJECT","SET_LIST","email","themeId","alternativeEmails","calendarStartingDayOfWeek","calendarStartingHour","calendarViewId","hasPrioritySupport","isCancelled","isRecurring","paperAutoSave","timeZone","PUSH_ONE_ALTERNATIVE_EMAIL","unshift","SET_ALTERNATIVE_EMAILS","SET_CALENDAR_STARTING_DAY_OF_WEEK","SET_CALENDAR_STARTING_HOUR","SET_CALENDAR_VIEW_ID","SET_EMAIL","SET_EXPIRATION_DATE","SET_FULL_NAME","SET_HAS_PRIORITY_SUPPORT","SET_ID","SET_INSTITUTION","SET_IS_CANCELLED","SET_IS_IMPERSONATING","SET_IS_RECURRING","SET_ORGANIZATION_EXPIRATION_DATE","SET_ORGANIZATION_ID","SET_ORGANIZATION_STATUS_ID","SET_PAPER_AUTO_SAVE","SET_ROLE","SET_THEME_ID","SET_TIME_ZONE","setSiteTheme","convertedThemeId","REGULAR","legacyThemeId","classList","remove","DARK","SERRENA","validation","ADD_FORM_TO_LIST","formId","isDirty","isValid","ADD_VALIDATION","fullId","invalidErrorMessage","validateEnum","MARK_ALL_CLEAN","formData","MARK_FORM_CLEAN_BY_ID","findIndex","MARK_FORM_DIRTY_BY_ID","MARK_FORM_INVALID_BY_ID","MARK_FORM_VALID_BY_ID","REMOVE_FORM_BY_ID","SET_VALIDATION","addValidation","EMAIL","EMAIL_REQUIRED","fieldLabel","NUMERIC","NUMERIC_REQUIRED","REQUIRED","password","school","SET_PASSWORD","SET_SCHOOL","addFromLibraryIsByName","paperListOrderBy","paperListSorts","referenceListOrderBy","referenceListSorts","reminderListOrderBy","reminderListSorts","searchTerm","PAPER_LIST_ORDER_BY","PAPER_LIST_SORTS_TOGGLE","REFERENCE_LIST_ORDER_BY","REFERENCE_LIST_SORTS_TOGGLE","REMINDER_LIST_ORDER_BY","REMINDER_LIST_SORTS_TOGGLE","SEARCH_TERM","SET_ADD_FROM_LIBRARY_IS_BY_NAME","ADD_ID","REMOVE_ID","recentTypeIds","editCitation","editReference","focusIdOnLoad","openCitationUID","referenceDefaultName","referenceDefaultValue","referenceRules","referencesInPaper","updateAfterSync","ADD_TO_UPDATE_AFTER_SYNC","newReference","RESET_UPDATE_AFTER_SYNC","SET_OPEN_CITATION_UID","ADD_REFERENCE_TO_PAPER","RECENT_TYPE_IDS_ADD","refTypeId","maxRecentReferenceTypes","REMOVE_CITATION_FROM_PAPER","thisReferenceIndex","thisCitationIndex","cit","citationUniqueID","REMOVE_REFERENCE_FROM_PAPER","SET_REFERENCES_IN_PAPER","addFromMode","isShowWarning","referenceData","HIDE_WARNING","SET_ADD_FROM_MODE","SET_REFERENCE_DATA","SET_REFERENCE_OBJECT","SHOW_WARNING","processDuplicate","referenceID","root","refValues","HelperGetReferenceFormatId","REVIEW","NORMAL","MLA9","Turabian9","HelperCheckReferenceData","publishersDefault","formDataDefault","originalArticleNumber","originalEdition","originalReferencePages","publishersV2","toggleSelect","doiUrl","isCommonUse","selectedOption","options","helpText","originalDoiUrl","originalPagesArticle","pagesArticle","retractionDoiUrl","retractionPagesArticle","retractionReferencePages","translatedNewspaperTitle","translatedVolumeTitle","isCreateNextEnabled","isTranslator","referenceTypeId","referenceTypeName","rulesObjectData","rulesObjectValues","PUSH_TO_CONTRIBUTORS","PUSH_TO_CITATION","PUSH_TO_PUBLISHERS","fieldType","REMOVE_CONTRIBUTOR_AT_INDEX","contributorIndex","REMOVE_CONTRIBUTOR_BY_ID","findThisContributorIndex","contributorData","REMOVE_CITATION_AT_INDEX","citationIndex","REMOVE_PUBLISHER_AT_INDEX","publisherIndex","RESET_FORM_DATA","SET_IS_CREATE_NEXT_ENABLED","SET_IS_TRANSLATOR","SET_REFERENCE_TYPE_ID","SET_REFERENCE_TYPE_NAME","SET_RULES_OBJECT_DATA","SET_RULES_OBJECT_VALUES","SORT_CITATION","oldIndex","SORT_CONTRIBUTORS","SORT_PUBLISHERS","UPDATE_CONTRIBUTOR_AT_INDEX","UPDATE_FORM_DATA","UPDATE_CITATION_AT_INDEX","UPDATE_PUBLISHER_AT_INDEX","UPDATE_TOGGLE_SELECT_CLEAR_UNSELECTED_OPTION","unselectedOptionName","UPDATE_TOGGLE_SELECT_AT_GROUP","UPDATE_TOGGLE_SELECT_SELECTED_OPTION","deepClear","generateReference","openReferenceTab","referenceTypeSlug","generateReferencePreview","_referenceFormatTypeId","_collectedRefData","multiTextArray","cleanValue","arrayOfPublishers","publisherType","publisherData","toggleSelectData","optionValue","optionKey","modeLevel","_values","Engine","resetFormData","_ref4","roleDropdownChange","_ref5","is3pluErrorState","activeResearchNotes","ADD_TO_LIST","CLEAR_LIST","RESEACH_NOTE_ADD_ACTIVE","noteId","researchNoteData","paperGuid","RESEACH_NOTE_TOGGLE_ACTIVE","REMOVE_CITATION_BY_UNIQUE_ID","researchNoteUniqueId","findResearchNote","find","genesisResearchNoteUniqueId","citationOutput","REMOVE_BY_UNIQUE_ID","UPDATE_CITATION_BY_UNIQUE_ID","newCitationData","UPDATE_TEXT_BY_UNIQUE_ID","note","newNoteText","referenceResults","REFERENCE_RESULTS","Vuex","strict","process","plugins","createPersistedState","paths","modules","classes","forms","freeTrial","gridSorts","referenceDuplicate","researchNotes","thirdPartyLookup","idToken","lastSyncDate","openReferenceId","refLibCompString","refLibCompStringGenesis","contributorsDataCopy","paperTypeID","referenceLibrary","referenceLibraryGenesis","referenceTypeSearchTerm","show3pluRedirectMessage","LAST_SYNC_DATE","REFERENCE_LIBRARY","REFERENCE_LIBRARY_GENESIS","REFERENCE_REMOVE_FROM_LIBRARY","thisReferenceFindIndex","REFERENCE_TYPE_SEARCH_TERM_SET","SET_DOCUMENT_TYPE","SET_PAPER_GUID","SET_SHOW_3PLU_REDIRECT_MESSAGE","SHOW_BETA_FEATURES","map","webpackContext","req","webpackContextResolve","__webpack_require__","o","keys","__webpack_module_cache__","moduleId","cachedModule","loaded","__webpack_modules__","call","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","every","getter","__esModule","definition","defineProperty","enumerable","f","chunkId","all","reduce","promises","u","miniCssF","g","globalThis","Function","prop","hasOwnProperty","l","script","needAttach","scripts","createElement","charset","timeout","nc","src","onScriptComplete","prev","event","onload","clearTimeout","doneFns","parentNode","removeChild","bind","head","appendChild","Symbol","toStringTag","nmd","children","scriptUrl","importScripts","currentScript","tagName","p","loadStylesheet","fullhref","existingLinkTags","dataHref","tag","existingStyleTags","findStylesheet","oldTag","linkTag","nonce","realHref","request","insertBefore","nextSibling","createStylesheet","installedCssChunks","miniCss","installedChunks","installedChunkData","promise","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","chunkLoadingGlobal","self","__webpack_exports__"],"sourceRoot":""}