BibexPy 2.2.2__py3-none-any.whl → 2.2.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bibex_core/MergeDB.py +122 -19
- bibexpy/__init__.py +7 -1
- bibexpy/_server/routers/tools.py +8 -32
- bibexpy/_server/services/exporter.py +85 -30
- bibexpy/_server/services/smart_merger.py +13 -0
- bibexpy/_web/404/index.html +1 -1
- bibexpy/_web/404.html +1 -1
- bibexpy/_web/index.html +1 -1
- bibexpy/_web/index.txt +6 -6
- bibexpy/_web/projects/_/convert/index.html +1 -1
- bibexpy/_web/projects/_/convert/index.txt +6 -6
- bibexpy/_web/projects/_/disambiguate/index.html +1 -1
- bibexpy/_web/projects/_/disambiguate/index.txt +6 -6
- bibexpy/_web/projects/_/enrich/index.html +1 -1
- bibexpy/_web/projects/_/enrich/index.txt +6 -6
- bibexpy/_web/projects/_/export/index.html +1 -1
- bibexpy/_web/projects/_/export/index.txt +6 -6
- bibexpy/_web/projects/_/merge/index.html +1 -1
- bibexpy/_web/projects/_/merge/index.txt +6 -6
- bibexpy/_web/projects/_/records/index.html +1 -1
- bibexpy/_web/projects/_/records/index.txt +6 -6
- bibexpy/_web/projects/_/report/index.html +1 -1
- bibexpy/_web/projects/_/report/index.txt +6 -6
- bibexpy/_web/projects/_/upload/index.html +1 -1
- bibexpy/_web/projects/_/upload/index.txt +6 -6
- bibexpy/_web/projects/index.html +1 -1
- bibexpy/_web/projects/index.txt +6 -6
- bibexpy/_web/settings/index.html +1 -1
- bibexpy/_web/settings/index.txt +6 -6
- bibexpy/_web/tools/index.html +1 -1
- bibexpy/_web/tools/index.txt +6 -6
- bibexpy/cli.py +1 -1
- {bibexpy-2.2.2.dist-info → bibexpy-2.2.4.dist-info}/METADATA +1 -1
- {bibexpy-2.2.2.dist-info → bibexpy-2.2.4.dist-info}/RECORD +63 -63
- /bibexpy/_web/_next/static/chunks/{117-243189b36d27f566.js → 117-7ad5186126fa076d.js} +0 -0
- /bibexpy/_web/_next/static/chunks/{156-1d0bfe26481e7d6b.js → 156-75beffb8ae92a7f3.js} +0 -0
- /bibexpy/_web/_next/static/chunks/{2-60733f71509b56f6.js → 2-80e5ff6ecaab1b8b.js} +0 -0
- /bibexpy/_web/_next/static/chunks/{244-394d86488c726903.js → 244-67ea7b435f7b01fe.js} +0 -0
- /bibexpy/_web/_next/static/chunks/{361-967842df26f6ffcd.js → 361-da166e1b6724ae19.js} +0 -0
- /bibexpy/_web/_next/static/chunks/{367-d7abfef01f42a8b6.js → 367-0588c3750c19cf2a.js} +0 -0
- /bibexpy/_web/_next/static/chunks/{382-c2288944949cea21.js → 382-9881b7c21bd839aa.js} +0 -0
- /bibexpy/_web/_next/static/chunks/{484-d6534116174cb009.js → 484-94a0c3b42ea6645c.js} +0 -0
- /bibexpy/_web/_next/static/chunks/app/_not-found/{page-8200a2660cf860ab.js → page-873ba59b5eb7c342.js} +0 -0
- /bibexpy/_web/_next/static/chunks/app/{layout-81f99c0acd50f4fa.js → layout-0d5fc68ac8971a04.js} +0 -0
- /bibexpy/_web/_next/static/chunks/app/{page-431018c926501c8c.js → page-cf2bea5edc74459a.js} +0 -0
- /bibexpy/_web/_next/static/chunks/app/projects/[id]/convert/{page-a7fdd4dcdfee3e4e.js → page-ab6dd645ae113b64.js} +0 -0
- /bibexpy/_web/_next/static/chunks/app/projects/[id]/disambiguate/{page-45cd653a41947da4.js → page-dd98482cc47344e9.js} +0 -0
- /bibexpy/_web/_next/static/chunks/app/projects/[id]/enrich/{page-d763f71a4ed22e96.js → page-87685237c8053cee.js} +0 -0
- /bibexpy/_web/_next/static/chunks/app/projects/[id]/export/{page-d75bcea17e220a56.js → page-0c0b35cd340c6115.js} +0 -0
- /bibexpy/_web/_next/static/chunks/app/projects/[id]/merge/{page-1feb7d142414dc11.js → page-0d07d317cca1a351.js} +0 -0
- /bibexpy/_web/_next/static/chunks/app/projects/[id]/records/{page-3113ee5f64fff284.js → page-1d0b2f0f224627c3.js} +0 -0
- /bibexpy/_web/_next/static/chunks/app/projects/[id]/report/{page-2b5e662e83bad6b5.js → page-325bf5b09c3ead6b.js} +0 -0
- /bibexpy/_web/_next/static/chunks/app/projects/[id]/upload/{page-91c55affa48c27f9.js → page-8df78ca9cdecbcb8.js} +0 -0
- /bibexpy/_web/_next/static/chunks/app/projects/{page-23bef227659780b2.js → page-0d5ef841f6819454.js} +0 -0
- /bibexpy/_web/_next/static/chunks/app/settings/{page-158aad0a2ea97924.js → page-cf5de5a4789887a7.js} +0 -0
- /bibexpy/_web/_next/static/chunks/app/tools/{page-0b8e9c9243494cb7.js → page-2f4bb54673a0a396.js} +0 -0
- /bibexpy/_web/_next/static/chunks/{fd9d1056-91bed82f470bd18c.js → fd9d1056-f2718be92181f426.js} +0 -0
- /bibexpy/_web/_next/static/{kiP541v1aZJ2t7QWY6pup → gQytYgMGVzgbBStX7w9YJ}/_buildManifest.js +0 -0
- /bibexpy/_web/_next/static/{kiP541v1aZJ2t7QWY6pup → gQytYgMGVzgbBStX7w9YJ}/_ssgManifest.js +0 -0
- {bibexpy-2.2.2.dist-info → bibexpy-2.2.4.dist-info}/WHEEL +0 -0
- {bibexpy-2.2.2.dist-info → bibexpy-2.2.4.dist-info}/entry_points.txt +0 -0
- {bibexpy-2.2.2.dist-info → bibexpy-2.2.4.dist-info}/licenses/LICENSE +0 -0
- {bibexpy-2.2.2.dist-info → bibexpy-2.2.4.dist-info}/top_level.txt +0 -0
bibex_core/MergeDB.py
CHANGED
|
@@ -1,16 +1,60 @@
|
|
|
1
1
|
import pandas as pd
|
|
2
2
|
import re
|
|
3
3
|
import os
|
|
4
|
-
from typing import List, Union
|
|
4
|
+
from typing import List, Union, Optional
|
|
5
5
|
import numpy as np
|
|
6
6
|
from unidecode import unidecode
|
|
7
7
|
|
|
8
|
+
from bibex_core.cr_normalize import normalize_cr, count_refs
|
|
9
|
+
|
|
8
10
|
def trim(text: str) -> str:
|
|
9
11
|
"""Removes extra spaces from text"""
|
|
10
12
|
if pd.isna(text):
|
|
11
13
|
return ""
|
|
12
14
|
return re.sub(r'\s+', ' ', str(text)).strip()
|
|
13
15
|
|
|
16
|
+
# DOI önek/ayırıcı kalıpları — _canon_doi için.
|
|
17
|
+
_DOI_URL_PREFIX_RE = re.compile(r'^https?://(dx\.)?doi\.org/', re.IGNORECASE)
|
|
18
|
+
_DOI_SEP_RE = re.compile(r'[_\u2010-\u2015]')
|
|
19
|
+
|
|
20
|
+
def _canon_doi(value) -> Optional[str]:
|
|
21
|
+
"""DOI'yi karşılaştırma için kanonik biçime indirger.
|
|
22
|
+
|
|
23
|
+
services.smart_merger.normalize_doi'nin bire bir aynadaki eşi. bibex_core
|
|
24
|
+
sunucu (apps/api) kodunu İMPORT ETMEMELİDİR — paket headless kullanımda
|
|
25
|
+
tek başına çalışır — bu yüzden kopya burada yerel tutulur; smart_merger'daki
|
|
26
|
+
kural değişirse bu fonksiyon da güncellenmelidir.
|
|
27
|
+
|
|
28
|
+
Ham 'DI' üzerinde gruplamak aynı makaleyi ayrı gruplara böler: büyük/küçük
|
|
29
|
+
harf, 'https://doi.org/' öneki ve ayırıcı yazımı dizinleyiciden dizinleyiciye
|
|
30
|
+
değişir (WoS '10.4103/jgid.jgid_12_19', Scopus '10.4103/jgid.jgid-12-19').
|
|
31
|
+
|
|
32
|
+
Geçersiz/boş girdi ya da '10.' ile başlamayan sonuç için None döner.
|
|
33
|
+
"""
|
|
34
|
+
if value is None:
|
|
35
|
+
return None
|
|
36
|
+
try:
|
|
37
|
+
if pd.isna(value):
|
|
38
|
+
return None
|
|
39
|
+
except (TypeError, ValueError):
|
|
40
|
+
pass
|
|
41
|
+
s = str(value).strip().lower()
|
|
42
|
+
if not s:
|
|
43
|
+
return None
|
|
44
|
+
# Kirli veride önekler üst üste binebilir; değişmez hale gelene dek soy.
|
|
45
|
+
for _ in range(4):
|
|
46
|
+
prev = s
|
|
47
|
+
s = _DOI_URL_PREFIX_RE.sub('', s)
|
|
48
|
+
s = re.sub(r'^doi\s*:\s*', '', s)
|
|
49
|
+
s = re.sub(r'^doi\.org/', '', s)
|
|
50
|
+
if s == prev:
|
|
51
|
+
break
|
|
52
|
+
s = s.rstrip('/. \t')
|
|
53
|
+
s = _DOI_SEP_RE.sub('-', s)
|
|
54
|
+
if not s.startswith('10.'):
|
|
55
|
+
return None
|
|
56
|
+
return s
|
|
57
|
+
|
|
14
58
|
def merge_values(x):
|
|
15
59
|
"""
|
|
16
60
|
Merges values from a pandas Series, handling NaN values and duplicates.
|
|
@@ -218,6 +262,13 @@ def merge_references(wos_refs: str, scopus_refs: str) -> str:
|
|
|
218
262
|
Returns:
|
|
219
263
|
str: Birleştirilmiş ve temizlenmiş referanslar
|
|
220
264
|
"""
|
|
265
|
+
# ÖNCE normalize et: Scopus dilbilgisinde ';' yazar AYIRICISIDIR — ham
|
|
266
|
+
# Scopus CR'ı aşağıdaki split(';') bir referansı yazar kırıntılarına böler
|
|
267
|
+
# ve sıralamayı bozar. normalize_cr sonrası ';' yalnız referans sınırıdır
|
|
268
|
+
# (WoS dilbilgisi); idempotent olduğundan WoS girdisi değişmez.
|
|
269
|
+
wos_refs = normalize_cr(wos_refs) if isinstance(wos_refs, str) else wos_refs
|
|
270
|
+
scopus_refs = normalize_cr(scopus_refs) if isinstance(scopus_refs, str) else scopus_refs
|
|
271
|
+
|
|
221
272
|
def split_and_clean_refs(refs_str):
|
|
222
273
|
if pd.isna(refs_str) or not refs_str:
|
|
223
274
|
return []
|
|
@@ -780,54 +831,69 @@ def merge_db_sources(*dataframes: pd.DataFrame, remove_duplicated: bool = True,
|
|
|
780
831
|
M['DB_Original'] = M['DB']
|
|
781
832
|
|
|
782
833
|
if remove_duplicated:
|
|
834
|
+
# Kanonik DOI anahtarı: gruplama/dedupe HAM 'DI' üzerinde yapılamaz.
|
|
835
|
+
# Aynı makale WoS'ta '10.4103/jgid.jgid_12_19', Scopus'ta
|
|
836
|
+
# '10.4103/jgid.jgid-12-19' (ayrıca 'https://doi.org/...' öneki ve
|
|
837
|
+
# büyük/küçük harf farkı) olarak gelir; ham eşitlik bunları ayrı
|
|
838
|
+
# gruplara böler. Anahtarı None olan satırlar (DOI'siz/geçersiz)
|
|
839
|
+
# eskisi gibi başlık+yıl yoluna düşer. Yardımcı kolon çıktıdan silinir.
|
|
840
|
+
if 'DI' in M.columns:
|
|
841
|
+
M['_doi_key'] = M['DI'].map(_canon_doi)
|
|
842
|
+
|
|
783
843
|
if merge_fields:
|
|
784
844
|
# Group by DOI and select the most complete data within each group
|
|
785
|
-
if '
|
|
845
|
+
if '_doi_key' in M.columns:
|
|
846
|
+
has_doi = M['_doi_key'].notna()
|
|
786
847
|
# Group records with DOI
|
|
787
|
-
grouped = M[
|
|
848
|
+
grouped = M[has_doi].groupby('_doi_key', as_index=False).agg(
|
|
788
849
|
lambda x: '; '.join(sorted(set(str(val) for val in x if pd.notna(val)))) if x.name == 'DB_Original'
|
|
789
850
|
else merge_values(x)
|
|
790
851
|
)
|
|
791
|
-
|
|
852
|
+
|
|
792
853
|
# Update DB field for merged records
|
|
793
854
|
grouped.loc[grouped['DB_Original'].str.contains(';'), 'DB'] = 'BIBEXPY'
|
|
794
|
-
|
|
855
|
+
|
|
795
856
|
# Add records without DOI
|
|
796
|
-
no_doi = M[
|
|
857
|
+
no_doi = M[~has_doi]
|
|
797
858
|
M = pd.concat([grouped, no_doi], ignore_index=True)
|
|
798
|
-
|
|
859
|
+
|
|
799
860
|
# Check duplicates by title and year
|
|
800
861
|
if 'TI' in M.columns and 'PY' in M.columns:
|
|
801
|
-
# Clean titles
|
|
802
|
-
|
|
862
|
+
# Clean titles — küçük harfe indirmeden 'Deep Learning' ile
|
|
863
|
+
# 'Deep learning' iki ayrı anahtar üretir ve aynı kayıt iki kez
|
|
864
|
+
# kalır.
|
|
865
|
+
M['clean_title'] = M['TI'].apply(lambda x: re.sub(r'[^a-zA-Z0-9\s]', '', str(x)).lower())
|
|
803
866
|
M['clean_title'] = M['clean_title'].apply(trim)
|
|
804
|
-
|
|
867
|
+
|
|
805
868
|
# Group by title and year
|
|
806
869
|
M['title_year'] = M['clean_title'] + ' ' + M['PY'].astype(str)
|
|
807
|
-
|
|
870
|
+
|
|
808
871
|
# Select the most complete data for each group
|
|
809
872
|
grouped = M.groupby('title_year', as_index=False).agg(
|
|
810
873
|
lambda x: '; '.join(sorted(set(str(val) for val in x if pd.notna(val)))) if x.name == 'DB_Original'
|
|
811
874
|
else merge_values(x)
|
|
812
875
|
)
|
|
813
|
-
|
|
876
|
+
|
|
814
877
|
# Update DB field for merged records
|
|
815
878
|
grouped.loc[grouped['DB_Original'].str.contains(';'), 'DB'] = 'BIBEXPY'
|
|
816
|
-
|
|
879
|
+
|
|
817
880
|
M = grouped.drop(['title_year', 'clean_title'], axis=1)
|
|
818
881
|
else:
|
|
819
882
|
# Just remove duplicate records
|
|
820
|
-
if '
|
|
821
|
-
duplicates = M['
|
|
883
|
+
if '_doi_key' in M.columns:
|
|
884
|
+
duplicates = M['_doi_key'].duplicated() & M['_doi_key'].notna()
|
|
822
885
|
M = M[~duplicates]
|
|
823
|
-
|
|
886
|
+
|
|
824
887
|
if 'TI' in M.columns and 'PY' in M.columns:
|
|
825
|
-
clean_titles = M['TI'].apply(lambda x: re.sub(r'[^a-zA-Z0-9\s]', '', str(x)))
|
|
888
|
+
clean_titles = M['TI'].apply(lambda x: re.sub(r'[^a-zA-Z0-9\s]', '', str(x)).lower())
|
|
826
889
|
clean_titles = clean_titles.apply(trim)
|
|
827
890
|
title_year = clean_titles + ' ' + M['PY'].astype(str)
|
|
828
891
|
duplicates = title_year.duplicated()
|
|
829
892
|
M = M[~duplicates]
|
|
830
|
-
|
|
893
|
+
|
|
894
|
+
# Yardımcı anahtar kolonu çıktıya sızmamalı
|
|
895
|
+
M = M.drop(columns=['_doi_key'], errors='ignore')
|
|
896
|
+
|
|
831
897
|
# If there are multiple databases
|
|
832
898
|
if len(M['DB'].unique()) > 1:
|
|
833
899
|
# DB'yi ISI'ya set edelim
|
|
@@ -1129,9 +1195,46 @@ def merge_db_sources(*dataframes: pd.DataFrame, remove_duplicated: bool = True,
|
|
|
1129
1195
|
|
|
1130
1196
|
M.at[idx, 'OA'] = merge_open_access(wos_oa, scopus_oa)
|
|
1131
1197
|
|
|
1198
|
+
# Geçici RP kolonları yalnızca çok-kaynaklı dalda düşürülüyordu; dedupe tüm
|
|
1199
|
+
# satırları tek DB değerine indirdiğinde ('BIBEXPY' ya da tek kaynak) o dal
|
|
1200
|
+
# hiç çalışmaz ve RP_WOS/RP_SCOPUS çıktıya sızardı. RP burada zaten kendi
|
|
1201
|
+
# değerini taşır, bu yüzden koşulsuz düşürmek güvenli.
|
|
1202
|
+
M = M.drop(columns=['RP_WOS', 'RP_SCOPUS'], errors='ignore')
|
|
1203
|
+
|
|
1204
|
+
# CR normalizasyonu — Scopus dilbilgisindeki atıflar WoS dilbilgisine
|
|
1205
|
+
# çevrilir. Aksi hâlde VOSviewer/bibliometrix birleştirilmiş dataset'in
|
|
1206
|
+
# Scopus kaynaklı satırlarındaki atıfları hiç eşleştiremez: ölçülen bir
|
|
1207
|
+
# korpusta 436 kaydın 84'ü (ayrı bir korpusta %27) ayrıştırılamayan Scopus
|
|
1208
|
+
# biçimli CR yüzünden coupling ağlarının dışında kalıyordu.
|
|
1209
|
+
# normalize_cr idempotenttir; WoS satırları olduğu gibi geri döner.
|
|
1210
|
+
if 'CR' in M.columns:
|
|
1211
|
+
before = M['CR'].fillna('').astype(str)
|
|
1212
|
+
after = before.map(normalize_cr)
|
|
1213
|
+
# Yalnız dolu hücreler yazılır — boş/NaN CR hücreleri olduğu gibi kalır.
|
|
1214
|
+
filled_cr = before.str.strip() != ''
|
|
1215
|
+
changed = filled_cr & (after != before)
|
|
1216
|
+
if changed.any():
|
|
1217
|
+
M['CR'] = M['CR'].astype(object)
|
|
1218
|
+
M.loc[changed, 'CR'] = after[changed]
|
|
1219
|
+
|
|
1220
|
+
# NR (referans sayısı): CR bu adımda yeniden yazıldıysa VEYA NR boş/0
|
|
1221
|
+
# iken CR doluysa CR'den say. Scopus dosyalarında NR kolonu yoktur;
|
|
1222
|
+
# NR=0 + dolu CR ise eski merge'lerin yanlış değeridir — gerçekten
|
|
1223
|
+
# referanssız kayıtların CR'ı zaten boştur.
|
|
1224
|
+
if 'NR' not in M.columns:
|
|
1225
|
+
M['NR'] = ''
|
|
1226
|
+
nr_str = M['NR'].astype(str).str.strip()
|
|
1227
|
+
blank_or_zero = M['NR'].isna() | nr_str.isin(('', 'nan', 'NaN', 'None', '0', '0.0'))
|
|
1228
|
+
fill = (blank_or_zero | changed) & filled_cr
|
|
1229
|
+
if fill.any():
|
|
1230
|
+
# object'e çevir: int64/float64 kolona tamsayı yazmak 3 yerine
|
|
1231
|
+
# 3.0 üretir ve WoS dosyasına "NR 3.0" olarak düşer.
|
|
1232
|
+
M['NR'] = M['NR'].astype(object)
|
|
1233
|
+
M.loc[fill, 'NR'] = after[fill].map(count_refs)
|
|
1234
|
+
|
|
1132
1235
|
# Create SR tag
|
|
1133
1236
|
M = meta_tag_extraction(M, 'SR')
|
|
1134
|
-
|
|
1237
|
+
|
|
1135
1238
|
return M
|
|
1136
1239
|
|
|
1137
1240
|
def main():
|
bibexpy/__init__.py
CHANGED
|
@@ -5,5 +5,11 @@ Bundles an embedded FastAPI server and a prebuilt static UI in a single package,
|
|
|
5
5
|
requiring no Node.js or npm at runtime.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
from importlib.metadata import PackageNotFoundError, version as _pkg_version
|
|
9
|
+
|
|
10
|
+
try:
|
|
11
|
+
__version__ = _pkg_version("bibexpy")
|
|
12
|
+
except PackageNotFoundError: # running from source without an installed dist
|
|
13
|
+
from bibexpy.cli import __version__ # cli.py holds the release literal
|
|
14
|
+
|
|
9
15
|
__all__ = ["__version__"]
|
bibexpy/_server/routers/tools.py
CHANGED
|
@@ -20,6 +20,7 @@ from fastapi import APIRouter, BackgroundTasks, File, Form, HTTPException, Uploa
|
|
|
20
20
|
from fastapi.responses import FileResponse
|
|
21
21
|
|
|
22
22
|
from config import settings
|
|
23
|
+
from services import exporter
|
|
23
24
|
from services.bibex_adapter import _suppress_stdio
|
|
24
25
|
|
|
25
26
|
router = APIRouter(prefix="/tools", tags=["tools"])
|
|
@@ -97,40 +98,15 @@ def _read_source(src_path: Path, source_format: str) -> pd.DataFrame:
|
|
|
97
98
|
|
|
98
99
|
|
|
99
100
|
def _write_target(df: pd.DataFrame, target_format: str, out_path: Path) -> None:
|
|
100
|
-
"""DataFrame'i hedef formatta yaz
|
|
101
|
+
"""DataFrame'i hedef formatta yaz — proje Export'uyla AYNI yazıcı.
|
|
102
|
+
|
|
103
|
+
Yazma mantığı exporter.write_dataset'te tek yerde durur; burada kopyası
|
|
104
|
+
tutulduğunda iki yol birbirinden ayrışmıştı (SR üretimi yalnız Export'a
|
|
105
|
+
girmiş, Tools çıktısı biblioshiny'de çökmeye devam etmişti).
|
|
106
|
+
"""
|
|
101
107
|
if df.empty:
|
|
102
108
|
raise HTTPException(400, "file_empty")
|
|
103
|
-
|
|
104
|
-
if target_format == "xlsx":
|
|
105
|
-
df.to_excel(out_path, index=False)
|
|
106
|
-
elif target_format == "csv":
|
|
107
|
-
df.to_csv(out_path, index=False, encoding="utf-8")
|
|
108
|
-
elif target_format == "tsv":
|
|
109
|
-
df.to_csv(out_path, sep="\t", index=False, encoding="utf-8")
|
|
110
|
-
elif target_format == "wos":
|
|
111
|
-
from bibex_core.xlsx2vos import convert_excel_to_wos
|
|
112
|
-
tmp_xlsx = out_path.parent / f"_pre_wos_{out_path.stem}.xlsx"
|
|
113
|
-
df.to_excel(tmp_xlsx, index=False)
|
|
114
|
-
with _suppress_stdio():
|
|
115
|
-
convert_excel_to_wos(str(tmp_xlsx), str(out_path))
|
|
116
|
-
tmp_xlsx.unlink(missing_ok=True)
|
|
117
|
-
elif target_format == "vos":
|
|
118
|
-
cols = [c for c in ("AU", "TI", "SO", "PY", "VL", "IS", "PG", "DI",
|
|
119
|
-
"DE", "ID", "AB", "TC", "DT", "DB", "WC", "SC")
|
|
120
|
-
if c in df.columns]
|
|
121
|
-
if not cols:
|
|
122
|
-
# Hiçbir bibliometrik kolon yoksa tüm dataset'i TSV olarak yaz
|
|
123
|
-
df.to_csv(out_path, sep="\t", index=False, encoding="utf-8")
|
|
124
|
-
else:
|
|
125
|
-
df[cols].to_csv(out_path, sep="\t", index=False, encoding="utf-8")
|
|
126
|
-
elif target_format == "bib":
|
|
127
|
-
from services.bibtex_writer import write_bibtex
|
|
128
|
-
write_bibtex(df, out_path)
|
|
129
|
-
elif target_format == "ris":
|
|
130
|
-
from services.ris_writer import write_ris
|
|
131
|
-
write_ris(df, out_path)
|
|
132
|
-
else:
|
|
133
|
-
raise HTTPException(400, f"unsupported_target_format: {target_format}")
|
|
109
|
+
exporter.write_dataset(df, target_format, out_path)
|
|
134
110
|
|
|
135
111
|
|
|
136
112
|
def _safe_cleanup(path: Path) -> None:
|
|
@@ -11,6 +11,7 @@ import re
|
|
|
11
11
|
import time
|
|
12
12
|
from pathlib import Path
|
|
13
13
|
from typing import Any, Optional
|
|
14
|
+
from uuid import uuid4
|
|
14
15
|
|
|
15
16
|
import pandas as pd
|
|
16
17
|
from fastapi import HTTPException
|
|
@@ -148,6 +149,89 @@ def ensure_sr(df: pd.DataFrame) -> pd.DataFrame:
|
|
|
148
149
|
return out
|
|
149
150
|
|
|
150
151
|
|
|
152
|
+
def _normalize_cr_for_table(df: pd.DataFrame) -> pd.DataFrame:
|
|
153
|
+
"""Table exports get the same CR grammar as the WoS writer.
|
|
154
|
+
|
|
155
|
+
The WoS writer normalizes CR internally, but xlsx/csv/tsv would otherwise
|
|
156
|
+
carry Scopus-format references verbatim (raw source files converted in
|
|
157
|
+
Tools, or datasets merged before CR normalization existed). NR is recounted
|
|
158
|
+
where CR was rewritten or NR is blank/0 next to a non-empty CR — the same
|
|
159
|
+
rule as the merge path. Returns a new frame when anything changes; the
|
|
160
|
+
input is never mutated (it may be filter_engine's cached frame).
|
|
161
|
+
"""
|
|
162
|
+
if "CR" not in df.columns:
|
|
163
|
+
return df
|
|
164
|
+
from bibex_core.cr_normalize import count_refs, normalize_cr
|
|
165
|
+
|
|
166
|
+
before = df["CR"].fillna("").astype(str)
|
|
167
|
+
after = before.map(normalize_cr)
|
|
168
|
+
filled = before.str.strip() != ""
|
|
169
|
+
changed = filled & (after != before)
|
|
170
|
+
if "NR" in df.columns:
|
|
171
|
+
nr = df["NR"]
|
|
172
|
+
blank = nr.isna() | nr.astype(str).str.strip().isin(("", "nan", "NaN", "None", "0", "0.0"))
|
|
173
|
+
else:
|
|
174
|
+
blank = pd.Series(True, index=df.index)
|
|
175
|
+
fill = (blank | changed) & filled
|
|
176
|
+
if not changed.any() and not fill.any():
|
|
177
|
+
return df
|
|
178
|
+
|
|
179
|
+
out = df.copy(deep=False)
|
|
180
|
+
if changed.any():
|
|
181
|
+
out["CR"] = out["CR"].astype(object)
|
|
182
|
+
out.loc[changed, "CR"] = after[changed]
|
|
183
|
+
if fill.any():
|
|
184
|
+
base_nr = out["NR"] if "NR" in out.columns else pd.Series("", index=out.index)
|
|
185
|
+
out["NR"] = base_nr.astype(object)
|
|
186
|
+
out.loc[fill, "NR"] = after[fill].map(count_refs)
|
|
187
|
+
return out
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def write_dataset(df: pd.DataFrame, fmt: str, output: Any) -> None:
|
|
191
|
+
"""Write ``df`` as ``fmt`` to ``output`` — the single writer behind both the
|
|
192
|
+
project Export and the standalone Tools converter.
|
|
193
|
+
|
|
194
|
+
Keeping one implementation is deliberate: the two paths used to carry
|
|
195
|
+
copies of this logic and drifted (SR generation landed in Export only, so
|
|
196
|
+
Tools-converted spreadsheets still crashed biblioshiny).
|
|
197
|
+
"""
|
|
198
|
+
output = Path(output)
|
|
199
|
+
if fmt in _SR_FORMATS:
|
|
200
|
+
df = ensure_sr(_normalize_cr_for_table(df))
|
|
201
|
+
|
|
202
|
+
if fmt == "xlsx":
|
|
203
|
+
df.to_excel(output, index=False)
|
|
204
|
+
elif fmt == "csv":
|
|
205
|
+
df.to_csv(output, index=False, encoding="utf-8")
|
|
206
|
+
elif fmt == "tsv":
|
|
207
|
+
df.to_csv(output, sep="\t", index=False, encoding="utf-8")
|
|
208
|
+
elif fmt == "wos":
|
|
209
|
+
# bibex_core.xlsx2vos reads a workbook; the temp name is unique so two
|
|
210
|
+
# concurrent WoS exports in the same second cannot clobber each other.
|
|
211
|
+
from bibex_core.xlsx2vos import convert_excel_to_wos
|
|
212
|
+
tmp_xlsx = output.parent / f"_pre_wos_{uuid4().hex[:8]}.xlsx"
|
|
213
|
+
try:
|
|
214
|
+
df.to_excel(tmp_xlsx, index=False)
|
|
215
|
+
with _suppress_stdio():
|
|
216
|
+
convert_excel_to_wos(str(tmp_xlsx), str(output))
|
|
217
|
+
finally:
|
|
218
|
+
tmp_xlsx.unlink(missing_ok=True)
|
|
219
|
+
elif fmt == "vos":
|
|
220
|
+
# VOSviewer için tab-separated (bibliometrix uyumlu temel kolonlar);
|
|
221
|
+
# hiçbiri yoksa tüm tabloyu yaz (boş dosya üretme).
|
|
222
|
+
cols = [c for c in ("AU", "TI", "SO", "PY", "VL", "IS", "PG", "DI", "DE", "ID", "AB", "TC", "DT", "DB", "WC", "SC")
|
|
223
|
+
if c in df.columns]
|
|
224
|
+
(df[cols] if cols else df).to_csv(output, sep="\t", index=False, encoding="utf-8")
|
|
225
|
+
elif fmt == "bib":
|
|
226
|
+
from services.bibtex_writer import write_bibtex
|
|
227
|
+
write_bibtex(df, output)
|
|
228
|
+
elif fmt == "ris":
|
|
229
|
+
from services.ris_writer import write_ris
|
|
230
|
+
write_ris(df, output)
|
|
231
|
+
else:
|
|
232
|
+
raise HTTPException(400, f"unsupported_target_format: {fmt}")
|
|
233
|
+
|
|
234
|
+
|
|
151
235
|
def export(
|
|
152
236
|
project_id: str,
|
|
153
237
|
fmt: str,
|
|
@@ -177,36 +261,7 @@ def export(
|
|
|
177
261
|
name = f"export_{stamp}_{fmt}.{ext}" if ext != fmt else f"export_{stamp}.{ext}"
|
|
178
262
|
output = exports / Path(name).name
|
|
179
263
|
|
|
180
|
-
|
|
181
|
-
df = ensure_sr(df)
|
|
182
|
-
|
|
183
|
-
if fmt == "xlsx":
|
|
184
|
-
df.to_excel(output, index=False)
|
|
185
|
-
elif fmt == "csv":
|
|
186
|
-
df.to_csv(output, index=False, encoding="utf-8")
|
|
187
|
-
elif fmt == "tsv":
|
|
188
|
-
df.to_csv(output, sep="\t", index=False, encoding="utf-8")
|
|
189
|
-
elif fmt == "wos":
|
|
190
|
-
# Geçici XLSX üzerinden bibex_core.xlsx2vos
|
|
191
|
-
from bibex_core.xlsx2vos import convert_excel_to_wos
|
|
192
|
-
tmp_xlsx = exports / f"_tmp_{stamp}.xlsx"
|
|
193
|
-
df.to_excel(tmp_xlsx, index=False)
|
|
194
|
-
with _suppress_stdio():
|
|
195
|
-
convert_excel_to_wos(str(tmp_xlsx), str(output))
|
|
196
|
-
tmp_xlsx.unlink(missing_ok=True)
|
|
197
|
-
elif fmt == "vos":
|
|
198
|
-
# VOSviewer için tab-separated (bibliometrix uyumlu temel kolonlar)
|
|
199
|
-
cols = [c for c in ("AU", "TI", "SO", "PY", "VL", "IS", "PG", "DI", "DE", "ID", "AB", "TC", "DT", "DB", "WC", "SC")
|
|
200
|
-
if c in df.columns]
|
|
201
|
-
df[cols].to_csv(output, sep="\t", index=False, encoding="utf-8")
|
|
202
|
-
elif fmt == "bib":
|
|
203
|
-
from services.bibtex_writer import write_bibtex
|
|
204
|
-
write_bibtex(df, output)
|
|
205
|
-
elif fmt == "ris":
|
|
206
|
-
from services.ris_writer import write_ris
|
|
207
|
-
write_ris(df, output)
|
|
208
|
-
else:
|
|
209
|
-
raise HTTPException(500, "İç hata")
|
|
264
|
+
write_dataset(df, fmt, output)
|
|
210
265
|
|
|
211
266
|
storage.touch_project(project_id)
|
|
212
267
|
return output
|
|
@@ -76,6 +76,9 @@ STOPWORDS: set[str] = {
|
|
|
76
76
|
# ════════════════════════════════════════════════════════════════════════
|
|
77
77
|
|
|
78
78
|
_DOI_PREFIX_RE = re.compile(r"^https?://(dx\.)?doi\.org/", re.IGNORECASE)
|
|
79
|
+
# Alt çizgi + Unicode tire ailesi (hyphen, non-breaking hyphen, figure/en/em/
|
|
80
|
+
# horizontal dash) tek kanonik '-' işaretine katlanır.
|
|
81
|
+
_DOI_SEP_RE = re.compile(r"[_\u2010-\u2015]")
|
|
79
82
|
_PUNCT_RE = re.compile(r"[^a-z0-9 ]+")
|
|
80
83
|
_WS_RE = re.compile(r"\s+")
|
|
81
84
|
_LATEX_RE = re.compile(r"\\[a-z]+\{[^}]*\}|\\[\\\\&%$#_{}~^]")
|
|
@@ -108,6 +111,7 @@ def normalize_doi(raw: Any) -> Optional[str]:
|
|
|
108
111
|
'https://doi.org/10.1234/ABC' → '10.1234/abc'
|
|
109
112
|
'http://dx.doi.org/10.x' → '10.x'
|
|
110
113
|
'10.1234/abc/' → '10.1234/abc'
|
|
114
|
+
'10.4103/jgid.jgid_12_19' → '10.4103/jgid.jgid-12-19'
|
|
111
115
|
"""
|
|
112
116
|
s = _to_str(raw)
|
|
113
117
|
if not s:
|
|
@@ -123,6 +127,15 @@ def normalize_doi(raw: Any) -> Optional[str]:
|
|
|
123
127
|
if s == prev:
|
|
124
128
|
break
|
|
125
129
|
s = s.rstrip("/. \t")
|
|
130
|
+
# Ayırıcı katlaması: DOI'ler KANONİK biçimde karşılaştırılır, çünkü
|
|
131
|
+
# dizinleyiciler ayırıcıyı farklı yazıyor — WoS aynı makaleyi
|
|
132
|
+
# '10.4103/jgid.jgid_12_19', Scopus '10.4103/jgid.jgid-12-19' verir.
|
|
133
|
+
# Bir registrant'ın YALNIZCA '_' ile '-' farkı olan iki DOI'yi FARKLI
|
|
134
|
+
# eserler için üretmesi pratikte yok denecek kadar nadirdir; buna karşılık
|
|
135
|
+
# mevcut davranış gerçek çiftleri fiilen yasaklıyor: doi_conflict() True
|
|
136
|
+
# döndüğü an çift borderline kuyruğuna bile giremeden vetolanıyor
|
|
137
|
+
# (belirleyici DOI kuralı kanonik form üzerinde işler).
|
|
138
|
+
s = _DOI_SEP_RE.sub("-", s)
|
|
126
139
|
if not s.startswith("10."):
|
|
127
140
|
return None
|
|
128
141
|
return s
|
bibexpy/_web/404/index.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/loader.gif"/><link rel="preload" as="image" href="/images/bibexpy-logo-header.png"/><link rel="preload" as="image" href="/images/bibexpy-logo-in.png"/><link rel="stylesheet" href="/_next/static/css/76020a0003f90b67.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-c81f7fd28659d64f.js"/><script src="/_next/static/chunks/fd9d1056-91bed82f470bd18c.js" async=""></script><script src="/_next/static/chunks/117-243189b36d27f566.js" async=""></script><script src="/_next/static/chunks/main-app-d138a6e2f8c847f6.js" async=""></script><script src="/_next/static/chunks/156-1d0bfe26481e7d6b.js" async=""></script><script src="/_next/static/chunks/244-394d86488c726903.js" async=""></script><script src="/_next/static/chunks/2-60733f71509b56f6.js" async=""></script><script src="/_next/static/chunks/app/layout-81f99c0acd50f4fa.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>BibexPy V2</title><meta name="description" content="Harmonizing the Bibliometric Symphony of Scopus and Web of Science"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="min-h-screen flex flex-col bg-bg"><div class="transition-opacity duration-300 opacity-100"><div role="status" aria-live="polite" aria-busy="true" class="fixed inset-0 z-[100] flex items-center justify-center bg-ink/20 backdrop-blur-sm p-4"><div class="flex flex-col items-center justify-center gap-4 rounded-2xl bg-white px-10 py-8 shadow-2xl ring-1 ring-black/5"><img src="/images/loader.gif" alt="BibexPy" width="112" height="112" class="h-24 w-24 select-none object-contain" draggable="false"/></div><span class="sr-only">Loading…</span></div></div><header class="border-b border-slate-300/70 bg-[#f7f9fc] text-slate-900 shadow-[0_1px_0_rgba(255,255,255,0.04)]"><div class="mx-auto flex max-w-7xl flex-wrap items-stretch gap-3 px-4 py-3 sm:px-6"><div class="flex min-w-0 items-stretch overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-[0_4px_14px_-12px_rgba(15,23,42,0.25)] flex-1 justify-between"><a aria-label="BibexPy — ana sayfa" class="group flex shrink-0 items-center border-r border-slate-200 px-4 py-2 transition hover:bg-slate-50/70" href="/"><img src="/images/bibexpy-logo-header.png" alt="BibexPy — V2.0.0 Helium" draggable="false" class="h-full max-h-32 w-auto select-none transition group-hover:opacity-90"/></a><div class="flex min-w-0 flex-col"><div class="flex flex-1 items-stretch justify-center gap-2 px-4 pt-3 pb-2"><a class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition hover:bg-slate-50 hover:shadow-[0_4px_14px_-10px_rgba(15,23,42,0.4)]" href="/"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition bg-[#0c2847] text-cyan-200 group-hover:bg-[#173553] group-hover:text-cyan-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-house h-7 w-7"><path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"></path><path d="M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-700 group-hover:text-slate-900">Home</span></a><a class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition hover:bg-slate-50 hover:shadow-[0_4px_14px_-10px_rgba(15,23,42,0.4)]" href="/projects/"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition bg-[#0c2847] text-cyan-200 group-hover:bg-[#173553] group-hover:text-cyan-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-folder-kanban h-7 w-7"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path><path d="M8 10v4"></path><path d="M12 10v2"></path><path d="M16 10v6"></path></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-700 group-hover:text-slate-900">Projects</span></a><a class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition hover:bg-slate-50 hover:shadow-[0_4px_14px_-10px_rgba(15,23,42,0.4)]" href="/tools/"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition bg-[#0c2847] text-cyan-200 group-hover:bg-[#173553] group-hover:text-cyan-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-wrench h-7 w-7"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"></path></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-700 group-hover:text-slate-900">Tools</span></a></div><div class="border-t border-slate-200 px-3 py-1.5 text-center text-[10px] font-bold uppercase tracking-[0.18em] text-slate-400">Workspaces</div></div><div class="flex min-w-0 flex-col"><div class="flex flex-1 items-stretch justify-center gap-2 px-4 pt-3 pb-2"><a class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition hover:bg-slate-50 hover:shadow-[0_4px_14px_-10px_rgba(15,23,42,0.4)]" href="/settings/"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition bg-[#0c2847] text-cyan-200 group-hover:bg-[#173553] group-hover:text-cyan-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings h-7 w-7"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"></path><circle cx="12" cy="12" r="3"></circle></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-700 group-hover:text-slate-900">Settings</span></a></div><div class="border-t border-slate-200 px-3 py-1.5 text-center text-[10px] font-bold uppercase tracking-[0.18em] text-slate-400">System</div></div><div class="flex min-w-0 flex-col"><div class="flex flex-1 items-stretch justify-center gap-2 px-4 pt-3 pb-2"><a href="/docs" target="_blank" rel="noreferrer" class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition hover:bg-slate-50 hover:shadow-[0_4px_14px_-10px_rgba(15,23,42,0.4)]"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition bg-[#0c2847] text-cyan-200 group-hover:bg-[#173553] group-hover:text-cyan-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-code-xml h-7 w-7"><path d="m18 16 4-4-4-4"></path><path d="m6 8-4 4 4 4"></path><path d="m14.5 4-5 16"></path></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-700 group-hover:text-slate-900">API<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link h-3.5 w-3.5 text-slate-400"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></span></a><a href="https://github.com/bcankara/BibexPy" target="_blank" rel="noreferrer" class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition hover:bg-slate-50 hover:shadow-[0_4px_14px_-10px_rgba(15,23,42,0.4)]"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition bg-[#0c2847] text-cyan-200 group-hover:bg-[#173553] group-hover:text-cyan-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-book-open h-7 w-7"><path d="M12 7v14"></path><path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"></path></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-700 group-hover:text-slate-900">Source<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link h-3.5 w-3.5 text-slate-400"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></span></a></div><div class="border-t border-slate-200 px-3 py-1.5 text-center text-[10px] font-bold uppercase tracking-[0.18em] text-slate-400">Resources</div></div><div class="flex min-w-0 flex-col"><div class="flex flex-1 items-stretch justify-center gap-2 px-4 pt-3 pb-2"><button type="button" class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition bg-slate-100 ring-1 ring-slate-200 shadow-[0_4px_14px_-10px_rgba(15,23,42,0.3)]"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition ring-2 ring-cyan-500 shadow-[0_6px_18px_-8px_rgba(12,40,71,0.55)]"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="h-full w-full" preserveAspectRatio="xMidYMid slice" aria-label="English" role="img"><clipPath id="gb-flag-clip"><rect width="24" height="24"></rect></clipPath><g clip-path="url(#gb-flag-clip)"><rect width="24" height="24" fill="#012169"></rect><path d="M0,0 L24,24 M24,0 L0,24" stroke="#fff" stroke-width="5"></path><path d="M0,0 L24,24 M24,0 L0,24" stroke="#C8102E" stroke-width="2"></path><path d="M12,0 V24 M0,12 H24" stroke="#fff" stroke-width="8"></path><path d="M12,0 V24 M0,12 H24" stroke="#C8102E" stroke-width="5"></path></g></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-900">English</span></button><button type="button" class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition hover:bg-slate-50 hover:shadow-[0_4px_14px_-10px_rgba(15,23,42,0.4)]"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition ring-1 ring-slate-300/70 group-hover:ring-slate-400"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="h-full w-full" preserveAspectRatio="xMidYMid slice" aria-label="Türkçe" role="img"><rect width="24" height="24" fill="#E30A17"></rect><circle cx="8.5" cy="12" r="5" fill="#fff"></circle><circle cx="10" cy="12" r="4" fill="#E30A17"></circle><polygon fill="#fff" points="12.8,12 14.32,11.51 14.32,9.91 15.26,11.2 16.78,10.71 15.84,12 16.78,13.29 15.26,12.8 14.32,14.09 14.32,12.49"></polygon></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-700 group-hover:text-slate-900">Türkçe</span></button></div><div class="border-t border-slate-200 px-3 py-1.5 text-center text-[10px] font-bold uppercase tracking-[0.18em] text-slate-400">Language</div></div></div></div></header><main class="flex-1"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div></main><footer class="relative border-t border-slate-200 bg-gradient-to-b from-white to-[#eef2f8]"><div aria-hidden="true" class="pointer-events-none absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-cyan-400/60 to-transparent"></div><div class="mx-auto max-w-6xl px-6 py-10"><div class="grid grid-cols-2 gap-x-8 gap-y-9 md:grid-cols-[1.7fr_1fr_1fr]"><div class="col-span-2 md:col-span-1"><a aria-label="BibexPy" class="block w-full max-w-xs transition hover:opacity-90" href="/"><img src="/images/bibexpy-logo-in.png" alt="BibexPy — V2.0.0 Helium — Bibliometrics Experience with Python" draggable="false" class="h-auto w-full select-none"/></a><p class="mt-4 max-w-xs text-xs leading-relaxed text-slate-500">Self-hosted, reproducible bibliometric data preparation for Web of Science & Scopus.</p><div class="mt-4 flex items-center gap-1.5"><a href="https://github.com/bcankara/BibexPy" target="_blank" rel="noreferrer" aria-label="GitHub" title="GitHub" class="inline-flex h-8 w-8 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-500 transition hover:-translate-y-0.5 hover:border-cyan-300 hover:text-cyan-700 hover:shadow-sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-github h-4 w-4"><path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4"></path><path d="M9 18c-4.51 2-5-2-7-2"></path></svg></a><a href="https://www.youtube.com/@BibexPy" target="_blank" rel="noreferrer" aria-label="YouTube" title="YouTube" class="inline-flex h-8 w-8 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-500 transition hover:-translate-y-0.5 hover:border-cyan-300 hover:text-cyan-700 hover:shadow-sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-youtube h-4 w-4"><path d="M2.5 17a24.12 24.12 0 0 1 0-10 2 2 0 0 1 1.4-1.4 49.56 49.56 0 0 1 16.2 0A2 2 0 0 1 21.5 7a24.12 24.12 0 0 1 0 10 2 2 0 0 1-1.4 1.4 49.55 49.55 0 0 1-16.2 0A2 2 0 0 1 2.5 17"></path><path d="m10 15 5-3-5-3z"></path></svg></a><a href="https://twitter.com/BibexPy" target="_blank" rel="noreferrer" aria-label="X (Twitter)" title="X (Twitter)" class="inline-flex h-8 w-8 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-500 transition hover:-translate-y-0.5 hover:border-cyan-300 hover:text-cyan-700 hover:shadow-sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-twitter h-4 w-4"><path d="M22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z"></path></svg></a><a href="https://www.instagram.com/bibexpy/" target="_blank" rel="noreferrer" aria-label="Instagram" title="Instagram" class="inline-flex h-8 w-8 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-500 transition hover:-translate-y-0.5 hover:border-cyan-300 hover:text-cyan-700 hover:shadow-sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-instagram h-4 w-4"><rect width="20" height="20" x="2" y="2" rx="5" ry="5"></rect><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"></path><line x1="17.5" x2="17.51" y1="6.5" y2="6.5"></line></svg></a></div></div><div><h3 class="text-[11px] font-bold uppercase tracking-[0.14em] text-slate-400">Resources</h3><ul class="mt-3.5 space-y-2.5"><li><a href="/docs" target="_blank" rel="noreferrer" class="group inline-flex items-center gap-2 text-xs font-medium text-slate-500 transition hover:text-cyan-700"><span class="text-slate-400 transition group-hover:text-cyan-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-life-buoy h-3.5 w-3.5"><circle cx="12" cy="12" r="10"></circle><path d="m4.93 4.93 4.24 4.24"></path><path d="m14.83 9.17 4.24-4.24"></path><path d="m14.83 14.83 4.24 4.24"></path><path d="m9.17 14.83-4.24 4.24"></path><circle cx="12" cy="12" r="4"></circle></svg></span><span>Documentation</span></a></li><li><a class="group inline-flex items-center gap-2 text-xs font-medium text-slate-500 transition hover:text-cyan-700" href="/tools/"><span class="text-slate-400 transition group-hover:text-cyan-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-wrench h-3.5 w-3.5"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"></path></svg></span><span>Tools</span></a></li><li><a class="group inline-flex items-center gap-2 text-xs font-medium text-slate-500 transition hover:text-cyan-700" href="/settings/"><span class="text-slate-400 transition group-hover:text-cyan-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings h-3.5 w-3.5"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"></path><circle cx="12" cy="12" r="3"></circle></svg></span><span>Settings</span></a></li></ul></div><div><h3 class="text-[11px] font-bold uppercase tracking-[0.14em] text-slate-400">Project</h3><ul class="mt-3.5 space-y-2.5"><li><a href="https://doi.org/10.1016/j.softx.2025.102098" target="_blank" rel="noreferrer" class="group inline-flex items-center gap-2 text-xs font-medium text-slate-500 transition hover:text-cyan-700"><span class="text-slate-400 transition group-hover:text-cyan-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-text h-3.5 w-3.5"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"></path><path d="M14 2v4a2 2 0 0 0 2 2h4"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg></span><span>Paper · SoftwareX</span></a></li><li><a href="https://bibexpy.com" target="_blank" rel="noreferrer" class="group inline-flex items-center gap-2 text-xs font-medium text-slate-500 transition hover:text-cyan-700"><span class="text-slate-400 transition group-hover:text-cyan-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-globe h-3.5 w-3.5"><circle cx="12" cy="12" r="10"></circle><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"></path><path d="M2 12h20"></path></svg></span><span>Website</span></a></li><li><a href="mailto:info@bibexpy.com" target="_blank" rel="noreferrer" class="group inline-flex items-center gap-2 text-xs font-medium text-slate-500 transition hover:text-cyan-700"><span class="text-slate-400 transition group-hover:text-cyan-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-mail h-3.5 w-3.5"><rect width="20" height="16" x="2" y="4" rx="2"></rect><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"></path></svg></span><span>Contact</span></a></li></ul></div></div><div class="mt-9 flex flex-col items-start justify-between gap-3 border-t border-slate-200/70 pt-5 text-[11px] text-slate-400 sm:flex-row sm:items-center"><span>© 2025 BibexPy ·<!-- --> <a href="https://www.gnu.org/licenses/gpl-3.0" target="_blank" rel="noreferrer" class="font-medium text-slate-500 transition hover:text-cyan-700">GPL-3.0-or-later</a> <!-- -->· <!-- -->All rights reserved.</span><a href="https://doi.org/10.1016/j.softx.2025.102098" target="_blank" rel="noreferrer" class="group inline-flex items-center gap-1.5 font-semibold text-slate-500 transition hover:text-cyan-700">Kara, Şahin & Dirsehan (2025) · SoftwareX<span class="inline-block text-cyan-600 transition group-hover:translate-x-0.5">Cite →</span></a></div></div></footer><script src="/_next/static/chunks/webpack-c81f7fd28659d64f.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/76020a0003f90b67.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[2846,[],\"\"]\n4:I[4707,[],\"\"]\n5:I[6423,[],\"\"]\n6:I[1514,[\"156\",\"static/chunks/156-1d0bfe26481e7d6b.js\",\"244\",\"static/chunks/244-394d86488c726903.js\",\"2\",\"static/chunks/2-60733f71509b56f6.js\",\"185\",\"static/chunks/app/layout-81f99c0acd50f4fa.js\"],\"InitialLoadGate\"]\n7:I[3554,[\"156\",\"static/chunks/156-1d0bfe26481e7d6b.js\",\"244\",\"static/chunks/244-394d86488c726903.js\",\"2\",\"static/chunks/2-60733f71509b56f6.js\",\"185\",\"static/chunks/app/layout-81f99c0acd50f4fa.js\"],\"I18nProvider\"]\n8:I[5499,[\"156\",\"static/chunks/156-1d0bfe26481e7d6b.js\",\"244\",\"static/chunks/244-394d86488c726903.js\",\"2\",\"static/chunks/2-60733f71509b56f6.js\",\"185\",\"static/chunks/app/layout-81f99c0acd50f4fa.js\"],\"DialogProvider\"]\n9:I[7002,[\"156\",\"static/chunks/156-1d0bfe26481e7d6b.js\",\"244\",\"static/chunks/244-394d86488c726903.js\",\"2\",\"static/chunks/2-60733f71509b56f6.js\",\"185\",\"static/chunks/app/layout-81f99c0acd50f4fa.js\"],\"AppShell\"]\nf:I[1060,[],\"\"]\na:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\nb:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\nc:{\"display\":\"inline-block\"}\nd:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\n10:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"kiP541v1aZJ2t7QWY6pup\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\",\"\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/76020a0003f90b67.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"min-h-screen flex flex-col bg-bg\",\"children\":[[\"$\",\"$L6\",null,{}],[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$L8\",null,{\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$a\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$b\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$c\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$d\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]}]]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$Le\"],\"globalErrorComponent\":\"$f\",\"missingSlots\":\"$W10\"}]\n"])</script><script>self.__next_f.push([1,"e:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"BibexPy V2\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Harmonizing the Bibliometric Symphony of Scopus and Web of Science\"}]]\n3:null\n"])</script></body></html>
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/loader.gif"/><link rel="preload" as="image" href="/images/bibexpy-logo-header.png"/><link rel="preload" as="image" href="/images/bibexpy-logo-in.png"/><link rel="stylesheet" href="/_next/static/css/76020a0003f90b67.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-c81f7fd28659d64f.js"/><script src="/_next/static/chunks/fd9d1056-f2718be92181f426.js" async=""></script><script src="/_next/static/chunks/117-7ad5186126fa076d.js" async=""></script><script src="/_next/static/chunks/main-app-d138a6e2f8c847f6.js" async=""></script><script src="/_next/static/chunks/156-75beffb8ae92a7f3.js" async=""></script><script src="/_next/static/chunks/244-67ea7b435f7b01fe.js" async=""></script><script src="/_next/static/chunks/2-80e5ff6ecaab1b8b.js" async=""></script><script src="/_next/static/chunks/app/layout-0d5fc68ac8971a04.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>BibexPy V2</title><meta name="description" content="Harmonizing the Bibliometric Symphony of Scopus and Web of Science"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="min-h-screen flex flex-col bg-bg"><div class="transition-opacity duration-300 opacity-100"><div role="status" aria-live="polite" aria-busy="true" class="fixed inset-0 z-[100] flex items-center justify-center bg-ink/20 backdrop-blur-sm p-4"><div class="flex flex-col items-center justify-center gap-4 rounded-2xl bg-white px-10 py-8 shadow-2xl ring-1 ring-black/5"><img src="/images/loader.gif" alt="BibexPy" width="112" height="112" class="h-24 w-24 select-none object-contain" draggable="false"/></div><span class="sr-only">Loading…</span></div></div><header class="border-b border-slate-300/70 bg-[#f7f9fc] text-slate-900 shadow-[0_1px_0_rgba(255,255,255,0.04)]"><div class="mx-auto flex max-w-7xl flex-wrap items-stretch gap-3 px-4 py-3 sm:px-6"><div class="flex min-w-0 items-stretch overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-[0_4px_14px_-12px_rgba(15,23,42,0.25)] flex-1 justify-between"><a aria-label="BibexPy — ana sayfa" class="group flex shrink-0 items-center border-r border-slate-200 px-4 py-2 transition hover:bg-slate-50/70" href="/"><img src="/images/bibexpy-logo-header.png" alt="BibexPy — V2.0.0 Helium" draggable="false" class="h-full max-h-32 w-auto select-none transition group-hover:opacity-90"/></a><div class="flex min-w-0 flex-col"><div class="flex flex-1 items-stretch justify-center gap-2 px-4 pt-3 pb-2"><a class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition hover:bg-slate-50 hover:shadow-[0_4px_14px_-10px_rgba(15,23,42,0.4)]" href="/"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition bg-[#0c2847] text-cyan-200 group-hover:bg-[#173553] group-hover:text-cyan-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-house h-7 w-7"><path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"></path><path d="M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-700 group-hover:text-slate-900">Home</span></a><a class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition hover:bg-slate-50 hover:shadow-[0_4px_14px_-10px_rgba(15,23,42,0.4)]" href="/projects/"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition bg-[#0c2847] text-cyan-200 group-hover:bg-[#173553] group-hover:text-cyan-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-folder-kanban h-7 w-7"><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path><path d="M8 10v4"></path><path d="M12 10v2"></path><path d="M16 10v6"></path></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-700 group-hover:text-slate-900">Projects</span></a><a class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition hover:bg-slate-50 hover:shadow-[0_4px_14px_-10px_rgba(15,23,42,0.4)]" href="/tools/"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition bg-[#0c2847] text-cyan-200 group-hover:bg-[#173553] group-hover:text-cyan-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-wrench h-7 w-7"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"></path></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-700 group-hover:text-slate-900">Tools</span></a></div><div class="border-t border-slate-200 px-3 py-1.5 text-center text-[10px] font-bold uppercase tracking-[0.18em] text-slate-400">Workspaces</div></div><div class="flex min-w-0 flex-col"><div class="flex flex-1 items-stretch justify-center gap-2 px-4 pt-3 pb-2"><a class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition hover:bg-slate-50 hover:shadow-[0_4px_14px_-10px_rgba(15,23,42,0.4)]" href="/settings/"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition bg-[#0c2847] text-cyan-200 group-hover:bg-[#173553] group-hover:text-cyan-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings h-7 w-7"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"></path><circle cx="12" cy="12" r="3"></circle></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-700 group-hover:text-slate-900">Settings</span></a></div><div class="border-t border-slate-200 px-3 py-1.5 text-center text-[10px] font-bold uppercase tracking-[0.18em] text-slate-400">System</div></div><div class="flex min-w-0 flex-col"><div class="flex flex-1 items-stretch justify-center gap-2 px-4 pt-3 pb-2"><a href="/docs" target="_blank" rel="noreferrer" class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition hover:bg-slate-50 hover:shadow-[0_4px_14px_-10px_rgba(15,23,42,0.4)]"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition bg-[#0c2847] text-cyan-200 group-hover:bg-[#173553] group-hover:text-cyan-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-code-xml h-7 w-7"><path d="m18 16 4-4-4-4"></path><path d="m6 8-4 4 4 4"></path><path d="m14.5 4-5 16"></path></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-700 group-hover:text-slate-900">API<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link h-3.5 w-3.5 text-slate-400"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></span></a><a href="https://github.com/bcankara/BibexPy" target="_blank" rel="noreferrer" class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition hover:bg-slate-50 hover:shadow-[0_4px_14px_-10px_rgba(15,23,42,0.4)]"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition bg-[#0c2847] text-cyan-200 group-hover:bg-[#173553] group-hover:text-cyan-100"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-book-open h-7 w-7"><path d="M12 7v14"></path><path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"></path></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-700 group-hover:text-slate-900">Source<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link h-3.5 w-3.5 text-slate-400"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></span></a></div><div class="border-t border-slate-200 px-3 py-1.5 text-center text-[10px] font-bold uppercase tracking-[0.18em] text-slate-400">Resources</div></div><div class="flex min-w-0 flex-col"><div class="flex flex-1 items-stretch justify-center gap-2 px-4 pt-3 pb-2"><button type="button" class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition bg-slate-100 ring-1 ring-slate-200 shadow-[0_4px_14px_-10px_rgba(15,23,42,0.3)]"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition ring-2 ring-cyan-500 shadow-[0_6px_18px_-8px_rgba(12,40,71,0.55)]"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="h-full w-full" preserveAspectRatio="xMidYMid slice" aria-label="English" role="img"><clipPath id="gb-flag-clip"><rect width="24" height="24"></rect></clipPath><g clip-path="url(#gb-flag-clip)"><rect width="24" height="24" fill="#012169"></rect><path d="M0,0 L24,24 M24,0 L0,24" stroke="#fff" stroke-width="5"></path><path d="M0,0 L24,24 M24,0 L0,24" stroke="#C8102E" stroke-width="2"></path><path d="M12,0 V24 M0,12 H24" stroke="#fff" stroke-width="8"></path><path d="M12,0 V24 M0,12 H24" stroke="#C8102E" stroke-width="5"></path></g></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-900">English</span></button><button type="button" class="group flex flex-col items-center justify-start gap-2 rounded-lg px-3 py-2.5 text-center transition hover:bg-slate-50 hover:shadow-[0_4px_14px_-10px_rgba(15,23,42,0.4)]"><span class="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl transition ring-1 ring-slate-300/70 group-hover:ring-slate-400"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="h-full w-full" preserveAspectRatio="xMidYMid slice" aria-label="Türkçe" role="img"><rect width="24" height="24" fill="#E30A17"></rect><circle cx="8.5" cy="12" r="5" fill="#fff"></circle><circle cx="10" cy="12" r="4" fill="#E30A17"></circle><polygon fill="#fff" points="12.8,12 14.32,11.51 14.32,9.91 15.26,11.2 16.78,10.71 15.84,12 16.78,13.29 15.26,12.8 14.32,14.09 14.32,12.49"></polygon></svg></span><span class="inline-flex items-center gap-1 text-[13px] font-bold leading-none text-slate-700 group-hover:text-slate-900">Türkçe</span></button></div><div class="border-t border-slate-200 px-3 py-1.5 text-center text-[10px] font-bold uppercase tracking-[0.18em] text-slate-400">Language</div></div></div></div></header><main class="flex-1"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div></main><footer class="relative border-t border-slate-200 bg-gradient-to-b from-white to-[#eef2f8]"><div aria-hidden="true" class="pointer-events-none absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-cyan-400/60 to-transparent"></div><div class="mx-auto max-w-6xl px-6 py-10"><div class="grid grid-cols-2 gap-x-8 gap-y-9 md:grid-cols-[1.7fr_1fr_1fr]"><div class="col-span-2 md:col-span-1"><a aria-label="BibexPy" class="block w-full max-w-xs transition hover:opacity-90" href="/"><img src="/images/bibexpy-logo-in.png" alt="BibexPy — V2.0.0 Helium — Bibliometrics Experience with Python" draggable="false" class="h-auto w-full select-none"/></a><p class="mt-4 max-w-xs text-xs leading-relaxed text-slate-500">Self-hosted, reproducible bibliometric data preparation for Web of Science & Scopus.</p><div class="mt-4 flex items-center gap-1.5"><a href="https://github.com/bcankara/BibexPy" target="_blank" rel="noreferrer" aria-label="GitHub" title="GitHub" class="inline-flex h-8 w-8 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-500 transition hover:-translate-y-0.5 hover:border-cyan-300 hover:text-cyan-700 hover:shadow-sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-github h-4 w-4"><path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4"></path><path d="M9 18c-4.51 2-5-2-7-2"></path></svg></a><a href="https://www.youtube.com/@BibexPy" target="_blank" rel="noreferrer" aria-label="YouTube" title="YouTube" class="inline-flex h-8 w-8 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-500 transition hover:-translate-y-0.5 hover:border-cyan-300 hover:text-cyan-700 hover:shadow-sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-youtube h-4 w-4"><path d="M2.5 17a24.12 24.12 0 0 1 0-10 2 2 0 0 1 1.4-1.4 49.56 49.56 0 0 1 16.2 0A2 2 0 0 1 21.5 7a24.12 24.12 0 0 1 0 10 2 2 0 0 1-1.4 1.4 49.55 49.55 0 0 1-16.2 0A2 2 0 0 1 2.5 17"></path><path d="m10 15 5-3-5-3z"></path></svg></a><a href="https://twitter.com/BibexPy" target="_blank" rel="noreferrer" aria-label="X (Twitter)" title="X (Twitter)" class="inline-flex h-8 w-8 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-500 transition hover:-translate-y-0.5 hover:border-cyan-300 hover:text-cyan-700 hover:shadow-sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-twitter h-4 w-4"><path d="M22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z"></path></svg></a><a href="https://www.instagram.com/bibexpy/" target="_blank" rel="noreferrer" aria-label="Instagram" title="Instagram" class="inline-flex h-8 w-8 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-500 transition hover:-translate-y-0.5 hover:border-cyan-300 hover:text-cyan-700 hover:shadow-sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-instagram h-4 w-4"><rect width="20" height="20" x="2" y="2" rx="5" ry="5"></rect><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"></path><line x1="17.5" x2="17.51" y1="6.5" y2="6.5"></line></svg></a></div></div><div><h3 class="text-[11px] font-bold uppercase tracking-[0.14em] text-slate-400">Resources</h3><ul class="mt-3.5 space-y-2.5"><li><a href="/docs" target="_blank" rel="noreferrer" class="group inline-flex items-center gap-2 text-xs font-medium text-slate-500 transition hover:text-cyan-700"><span class="text-slate-400 transition group-hover:text-cyan-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-life-buoy h-3.5 w-3.5"><circle cx="12" cy="12" r="10"></circle><path d="m4.93 4.93 4.24 4.24"></path><path d="m14.83 9.17 4.24-4.24"></path><path d="m14.83 14.83 4.24 4.24"></path><path d="m9.17 14.83-4.24 4.24"></path><circle cx="12" cy="12" r="4"></circle></svg></span><span>Documentation</span></a></li><li><a class="group inline-flex items-center gap-2 text-xs font-medium text-slate-500 transition hover:text-cyan-700" href="/tools/"><span class="text-slate-400 transition group-hover:text-cyan-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-wrench h-3.5 w-3.5"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"></path></svg></span><span>Tools</span></a></li><li><a class="group inline-flex items-center gap-2 text-xs font-medium text-slate-500 transition hover:text-cyan-700" href="/settings/"><span class="text-slate-400 transition group-hover:text-cyan-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings h-3.5 w-3.5"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"></path><circle cx="12" cy="12" r="3"></circle></svg></span><span>Settings</span></a></li></ul></div><div><h3 class="text-[11px] font-bold uppercase tracking-[0.14em] text-slate-400">Project</h3><ul class="mt-3.5 space-y-2.5"><li><a href="https://doi.org/10.1016/j.softx.2025.102098" target="_blank" rel="noreferrer" class="group inline-flex items-center gap-2 text-xs font-medium text-slate-500 transition hover:text-cyan-700"><span class="text-slate-400 transition group-hover:text-cyan-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-text h-3.5 w-3.5"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"></path><path d="M14 2v4a2 2 0 0 0 2 2h4"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg></span><span>Paper · SoftwareX</span></a></li><li><a href="https://bibexpy.com" target="_blank" rel="noreferrer" class="group inline-flex items-center gap-2 text-xs font-medium text-slate-500 transition hover:text-cyan-700"><span class="text-slate-400 transition group-hover:text-cyan-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-globe h-3.5 w-3.5"><circle cx="12" cy="12" r="10"></circle><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"></path><path d="M2 12h20"></path></svg></span><span>Website</span></a></li><li><a href="mailto:info@bibexpy.com" target="_blank" rel="noreferrer" class="group inline-flex items-center gap-2 text-xs font-medium text-slate-500 transition hover:text-cyan-700"><span class="text-slate-400 transition group-hover:text-cyan-600"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-mail h-3.5 w-3.5"><rect width="20" height="16" x="2" y="4" rx="2"></rect><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"></path></svg></span><span>Contact</span></a></li></ul></div></div><div class="mt-9 flex flex-col items-start justify-between gap-3 border-t border-slate-200/70 pt-5 text-[11px] text-slate-400 sm:flex-row sm:items-center"><span>© 2025 BibexPy ·<!-- --> <a href="https://www.gnu.org/licenses/gpl-3.0" target="_blank" rel="noreferrer" class="font-medium text-slate-500 transition hover:text-cyan-700">GPL-3.0-or-later</a> <!-- -->· <!-- -->All rights reserved.</span><a href="https://doi.org/10.1016/j.softx.2025.102098" target="_blank" rel="noreferrer" class="group inline-flex items-center gap-1.5 font-semibold text-slate-500 transition hover:text-cyan-700">Kara, Şahin & Dirsehan (2025) · SoftwareX<span class="inline-block text-cyan-600 transition group-hover:translate-x-0.5">Cite →</span></a></div></div></footer><script src="/_next/static/chunks/webpack-c81f7fd28659d64f.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/76020a0003f90b67.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[2846,[],\"\"]\n4:I[4707,[],\"\"]\n5:I[6423,[],\"\"]\n6:I[1514,[\"156\",\"static/chunks/156-75beffb8ae92a7f3.js\",\"244\",\"static/chunks/244-67ea7b435f7b01fe.js\",\"2\",\"static/chunks/2-80e5ff6ecaab1b8b.js\",\"185\",\"static/chunks/app/layout-0d5fc68ac8971a04.js\"],\"InitialLoadGate\"]\n7:I[3554,[\"156\",\"static/chunks/156-75beffb8ae92a7f3.js\",\"244\",\"static/chunks/244-67ea7b435f7b01fe.js\",\"2\",\"static/chunks/2-80e5ff6ecaab1b8b.js\",\"185\",\"static/chunks/app/layout-0d5fc68ac8971a04.js\"],\"I18nProvider\"]\n8:I[5499,[\"156\",\"static/chunks/156-75beffb8ae92a7f3.js\",\"244\",\"static/chunks/244-67ea7b435f7b01fe.js\",\"2\",\"static/chunks/2-80e5ff6ecaab1b8b.js\",\"185\",\"static/chunks/app/layout-0d5fc68ac8971a04.js\"],\"DialogProvider\"]\n9:I[7002,[\"156\",\"static/chunks/156-75beffb8ae92a7f3.js\",\"244\",\"static/chunks/244-67ea7b435f7b01fe.js\",\"2\",\"static/chunks/2-80e5ff6ecaab1b8b.js\",\"185\",\"static/chunks/app/layout-0d5fc68ac8971a04.js\"],\"AppShell\"]\nf:I[1060,[],\"\"]\na:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\nb:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\nc:{\"display\":\"inline-block\"}\nd:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\n10:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"gQytYgMGVzgbBStX7w9YJ\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\",\"\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/76020a0003f90b67.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"min-h-screen flex flex-col bg-bg\",\"children\":[[\"$\",\"$L6\",null,{}],[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$L8\",null,{\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$a\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$b\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$c\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$d\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]}]]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$Le\"],\"globalErrorComponent\":\"$f\",\"missingSlots\":\"$W10\"}]\n"])</script><script>self.__next_f.push([1,"e:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"BibexPy V2\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Harmonizing the Bibliometric Symphony of Scopus and Web of Science\"}]]\n3:null\n"])</script></body></html>
|