MyTools / pages /Reference.py
Aye10032
update
58e0fa1
import random
from typing import Dict, Any
import requests
import streamlit as st
import yaml
from loguru import logger
from ui.Component import side_bar_links
from bs4 import BeautifulSoup
from utils.Decorator import retry
st.set_page_config(
page_title='工具箱',
page_icon='🔨',
layout='wide',
)
with st.sidebar:
side_bar_links()
def add():
ref_list: list = st.session_state.get('reference_list')
_data = {
'title': st.session_state.get('title'),
'pmid': st.session_state.get('pmid').replace('PMID:', '').replace(' ', ''),
'pmc': st.session_state.get('pmc').replace('PMCID:', '').replace(' ', ''),
'doi': st.session_state.get('doi').replace('DOI:', '').replace('https://doi.org/','').replace(' ', ''),
}
if _data in ref_list:
st.toast('already exist')
else:
ref_list.append(_data)
st.session_state.reference_list = ref_list
yaml_str = yaml.dump(ref_list)
st.session_state.reference_text = yaml_str
st.session_state['title'] = ''
st.session_state['pmid'] = ''
st.session_state['pmc'] = ''
st.session_state['doi'] = ''
def reset():
st.session_state.reference_list = []
st.session_state.reference_text = ''
# def anal_ml():
# nlm_str: str = st.session_state.get('nlm_text')
# nlm_list = nlm_str.split('.', 4)
# title = nlm_list[1]
# id_list = nlm_list[-1].split('; ')
# if len(id_list) > 1:
# pmc = id_list[-1]
# else:
# pmc = ''
# base_list = id_list[0].split('. ')
# doi = base_list[0]
# pmid = base_list[1]
#
# _data = {
# 'title': title[1:] if title.startswith(' ') else title,
# 'pmid': pmid.replace('PMID:', '').replace(' ', ''),
# 'pmc': pmc.replace('PMCID:', '').replace(' ', '').replace('.', ''),
# 'doi': doi.replace('doi:', '').replace(' ', ''),
# }
#
# ref_list: list = st.session_state.get('reference_list')
#
# if _data in ref_list:
# st.toast('already exist')
# else:
# ref_list.append(_data)
# st.session_state.reference_list = ref_list
# yaml_str = yaml.dump(ref_list)
# st.session_state.reference_text = yaml_str
#
# st.session_state['nlm_text'] = ''
def get_data():
term: str = st.session_state.get('term_text')
term = term.replace('\r', ' ').replace('\n', '')
_data = __get_info(term)
ref_list: list = st.session_state.get('reference_list')
if _data in ref_list:
st.toast('already exist')
else:
ref_list.append(_data)
st.session_state.reference_list = ref_list
yaml_str = yaml.dump(ref_list, width=999)
st.session_state.reference_text = yaml_str
st.session_state['term_text'] = ''
@retry(delay=random.uniform(2.0, 5.0))
def __get_info(pmid: str) -> Dict[str, Any]:
url = f'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id={pmid}&retmode=xml'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
response = requests.request("GET", url, headers=headers, timeout=10)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'xml')
title = soup.find('Article').find('ArticleTitle').text if soup.find('Article') else None
doi_block = soup.find('ArticleIdList').find('ArticleId', {'IdType': 'doi'})
if doi_block:
doi = doi_block.text
else:
doi = ''
logger.warning('DOI not found')
pmc_block = soup.find('ArticleIdList').find('ArticleId', {'IdType': 'pmc'})
if pmc_block:
pmc = pmc_block.text.replace('PMC', '')
else:
pmc = ''
return {
'title': title,
'pmid': pmid,
'pmc': pmc,
'doi': doi
}
def del_item():
index: int = st.session_state.get('delete_id')
ref_list: list = st.session_state.get('reference_list')
ref_list.pop(index)
yaml_str = yaml.dump(ref_list, width=999)
st.session_state.reference_text = yaml_str
st.session_state.reference_list = ref_list
st.title("引用格式化")
col1, col2 = st.columns([1, 1], gap="medium")
if 'reference_list' not in st.session_state:
st.session_state.reference_list = []
if 'reference_text' not in st.session_state:
st.session_state.reference_text = ''
with col1:
with st.expander('manual'):
st.text_input('title', key='title')
col1_1, col1_2 = st.columns([1, 1], gap="small")
col1_1.text_input('pmid', key='pmid')
col1_2.text_input('pmc', key='pmc')
st.text_input('doi', key='doi')
col2_1, col2_2 = st.columns([1, 1], gap="small")
col2_1.button('add', use_container_width=True, type='primary', on_click=add)
col2_2.button('reset', use_container_width=True, on_click=reset)
st.text_input('Search', key='term_text')
st.button('add', use_container_width=True, on_click=get_data)
if len(st.session_state.get('reference_list')) > 0:
st.divider()
st.write('共有', len(st.session_state.get('reference_list')), '条引用')
col3_1, col3_2 = st.columns([2, 1], gap='small')
col3_1.number_input(
'id',
min_value=0,
max_value=len(st.session_state.get('reference_list')) - 1,
key='delete_id',
label_visibility='collapsed'
)
col3_2.button('delete', type='primary', on_click=del_item)
with col2:
with st.container(height=486, border=True):
st.write(st.session_state.get('reference_list'))
st.code(st.session_state.get('reference_text'), language='yaml')