import gradio as gr import re def parse_references(references): parsed_refs = [] prev_author = None for ref in references.split('\n'): # Remove text in italics or quotation marks ref = re.sub(r'.*?|".*?"', '', ref) # Check if the reference starts with -- or a dash if ref.strip().startswith('--') or ref.strip().startswith('-'): author = prev_author ref = ref.lstrip('- ') # Remove leading dashes and spaces else: # Find author (first word) and update prev_author author_match = re.search(r'\b\w+', ref) author = author_match.group() if author_match else None prev_author = author # Find year (first 4-digit number) year_match = re.search(r'\b\d{4}\b', ref) if author and year_match: parsed_refs.append({ 'author': author, 'year': year_match.group(), 'full_ref': ref.strip() }) return parsed_refs def find_citations(text, parsed_refs): citations = {} paragraphs = text.split('\n\n') for ref in parsed_refs: author = ref['author'] year = ref['year'] pattern = rf'{re.escape(author)}.*?{re.escape(year)}' citations[ref['full_ref']] = [] for paragraph in paragraphs: matches = re.findall(pattern, paragraph, re.IGNORECASE) citations[ref['full_ref']].extend(matches) return citations def process_text_and_references(text, references): parsed_refs = parse_references(references) citations = find_citations(text, parsed_refs) output = [] for ref, cites in citations.items(): output.append(f"Reference: {ref}") if cites: output.append("In-text citations:") for cite in cites: output.append(f"- {cite}") else: output.append("No in-text citations found.") output.append("") # Add a blank line between references return "\n".join(output) # Create Gradio interface iface = gr.Interface( fn=process_text_and_references, inputs=[ gr.Textbox(label="Text", lines=10), gr.Textbox(label="References", lines=10) ], outputs=gr.Textbox(label="References and In-text Citations"), title="In-text Citation Finder", description="Enter your text and references to find in-text citations for each reference." ) if __name__ == "__main__": iface.launch()