JSInlineCitation CreateInlineCitation(IEnumerable <EntryAndPagePair> itemSources, object idToUse = null) { // ****IMPORTANT**** // This is called from InsertCitationSequence, InsertCitation, EditCitation and CitationInserter.UpdateCitationsFromDatabase // // It is imperative that calls from the first 3 work on an empty CiteProc otherwise the cache gets used to create // the citation items. Other than first-use, this means using the item after CiteProc has seen it and maybe modified it // (it appears to change the Date Parts to strings in some cases) // The next refresh is then comparing incorrect JSON and will want to update it from the database. // // (CitationInserter.UpdateCitationsFromDatabase calls here but this is always within a Refresh which means a brand new CiteProc anyway // and so multiple resets here are not a problem because the raw cache would be empty anyway) CiteProc.ResetProcessorState(); var result = new JSInlineCitation(CiteProc); if (idToUse != null) { result.CitationID = idToUse; } result.Properties.NoteIndex = 0; foreach (var itemSource in itemSources) { var inlineCitationItem = CiteProc.CreateJSInlineCitationItem(itemSource); result.CitationItems.Add(inlineCitationItem); } // We store this before Citeproc gets hold of it! result.FieldCodeJSON = CiteProc.ToJSON(result.JSObject, JSONWhitespace).Replace('\n', '\v') + FieldCodeSeparator; return(result); }