pub-analyzer 0.4.3__py3-none-any.whl → 0.5.1__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.
Potentially problematic release.
This version of pub-analyzer might be problematic. Click here for more details.
- pub_analyzer/css/editor.tcss +60 -0
- pub_analyzer/css/report.tcss +15 -6
- pub_analyzer/internal/limiter.py +34 -0
- pub_analyzer/internal/render.py +17 -44
- pub_analyzer/internal/report.py +60 -29
- pub_analyzer/internal/templates/author_report.typ +556 -0
- pub_analyzer/main.py +4 -7
- pub_analyzer/models/institution.py +3 -3
- pub_analyzer/widgets/author/tables.py +2 -1
- pub_analyzer/widgets/body.py +19 -0
- pub_analyzer/widgets/common/__init__.py +2 -0
- pub_analyzer/widgets/common/label.py +36 -0
- pub_analyzer/widgets/report/core.py +10 -0
- pub_analyzer/widgets/report/editor.py +80 -0
- pub_analyzer/widgets/report/export.py +2 -4
- pub_analyzer/widgets/report/work.py +145 -6
- pub_analyzer/widgets/search/__init__.py +2 -2
- pub_analyzer/widgets/search/results.py +2 -12
- {pub_analyzer-0.4.3.dist-info → pub_analyzer-0.5.1.dist-info}/METADATA +7 -8
- {pub_analyzer-0.4.3.dist-info → pub_analyzer-0.5.1.dist-info}/RECORD +23 -23
- {pub_analyzer-0.4.3.dist-info → pub_analyzer-0.5.1.dist-info}/WHEEL +1 -1
- pub_analyzer/internal/templates/author/author_summary.typ +0 -112
- pub_analyzer/internal/templates/author/report.typ +0 -91
- pub_analyzer/internal/templates/author/sources.typ +0 -22
- pub_analyzer/internal/templates/author/works.typ +0 -154
- pub_analyzer/internal/templates/author/works_extended.typ +0 -109
- {pub_analyzer-0.4.3.dist-info → pub_analyzer-0.5.1.dist-info}/LICENSE +0 -0
- {pub_analyzer-0.4.3.dist-info → pub_analyzer-0.5.1.dist-info}/entry_points.txt +0 -0
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
// This document was generated using Pub Analyzer version {{ version }}.
|
|
2
|
-
//
|
|
3
|
-
// Pub Analyzer is a tool designed to retrieve, process and present in a concise and understandable
|
|
4
|
-
// way the scientific production of a researcher, including detailed information about their articles,
|
|
5
|
-
// citations, collaborations and other relevant metrics.
|
|
6
|
-
//
|
|
7
|
-
// See more here: https://pub-analyzer.com
|
|
8
|
-
|
|
9
|
-
// Packages
|
|
10
|
-
//
|
|
11
|
-
// This document uses the Cetz package to render plots and graphs. For more information
|
|
12
|
-
// on how to edit the plots see: https://typst.app/universe/package/cetz/
|
|
13
|
-
|
|
14
|
-
#import "@preview/cetz:0.2.2": canvas, plot, chart, palette
|
|
15
|
-
|
|
16
|
-
// Colors
|
|
17
|
-
//
|
|
18
|
-
// The following variables control all colors used in the document.
|
|
19
|
-
// You can modify the color codes by specifying the four RGB(A) components or by
|
|
20
|
-
// using the hexadecimal code.
|
|
21
|
-
//
|
|
22
|
-
// See more here: https://typst.app/docs/reference/visualize/color/#definitions-rgb
|
|
23
|
-
|
|
24
|
-
#let SUCCESS = rgb("#909d63")
|
|
25
|
-
#let ERROR = rgb("#bc5653")
|
|
26
|
-
|
|
27
|
-
#let CATEGORY_1 = rgb("#42a2f8")
|
|
28
|
-
#let CATEGORY_2 = rgb("#82d452")
|
|
29
|
-
#let CATEGORY_3 = rgb("#929292")
|
|
30
|
-
#let CATEGORY_4 = rgb("#f0bb40")
|
|
31
|
-
#let CATEGORY_5 = rgb("#eb4025")
|
|
32
|
-
#let CATEGORY_6 = rgb("#c33375")
|
|
33
|
-
|
|
34
|
-
#let PALETTE = (CATEGORY_1, CATEGORY_2, CATEGORY_3, CATEGORY_4, CATEGORY_5, CATEGORY_6)
|
|
35
|
-
|
|
36
|
-
// Page Layout
|
|
37
|
-
#set page("us-letter")
|
|
38
|
-
#set page(flipped: true)
|
|
39
|
-
|
|
40
|
-
#set heading(numbering: "1.")
|
|
41
|
-
#set page(footer: grid(
|
|
42
|
-
columns: (1fr, 1fr),
|
|
43
|
-
align(left)[Made with #link("https://pub-analyzer.com")[_pub-analyzer_] version {{ version }}],
|
|
44
|
-
align(right)[#counter(page).display("1")],
|
|
45
|
-
)
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
// Text config
|
|
49
|
-
#set text(size: 10pt)
|
|
50
|
-
#set par(justify: true)
|
|
51
|
-
|
|
52
|
-
// Override reference
|
|
53
|
-
#show ref: it => {
|
|
54
|
-
let el = it.element
|
|
55
|
-
if el != none and el.func() == heading {
|
|
56
|
-
// Override heading references.
|
|
57
|
-
numbering(
|
|
58
|
-
el.numbering,
|
|
59
|
-
..counter(heading).at(el.location())
|
|
60
|
-
)
|
|
61
|
-
} else {
|
|
62
|
-
// Other references as usual.
|
|
63
|
-
it
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Title
|
|
68
|
-
#grid(
|
|
69
|
-
columns: (1fr),
|
|
70
|
-
row-gutter: 11pt,
|
|
71
|
-
|
|
72
|
-
[#align(center, text(size: 17pt, weight: "bold")[{{ report.author.display_name }}])],
|
|
73
|
-
{% if report.author.last_known_institutions %}
|
|
74
|
-
{% set last_known_institution = report.author.last_known_institutions[0] %}
|
|
75
|
-
[#align(center, text(size: 15pt, weight: "thin")[{{ last_known_institution.display_name }}])],
|
|
76
|
-
{% endif %}
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
{% include 'author_summary.typ' %}
|
|
80
|
-
|
|
81
|
-
{% include 'works.typ' %}
|
|
82
|
-
|
|
83
|
-
{% include 'works_extended.typ' %}
|
|
84
|
-
|
|
85
|
-
{% include 'sources.typ' %}
|
|
86
|
-
|
|
87
|
-
#pagebreak()
|
|
88
|
-
|
|
89
|
-
= Bibliography
|
|
90
|
-
|
|
91
|
-
Priem, J., Piwowar, H., & Orr, R. (2022). OpenAlex: A fully-open index of scholarly works, authors, venues, institutions, and concepts. ArXiv. https://arxiv.org/abs/2205.01833
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
// Sources
|
|
2
|
-
= Sources.
|
|
3
|
-
|
|
4
|
-
#table(
|
|
5
|
-
columns: (auto, 3fr, 2fr, auto, auto, auto, auto, auto),
|
|
6
|
-
inset: 8pt,
|
|
7
|
-
align: horizon,
|
|
8
|
-
// Headers
|
|
9
|
-
[], [*Name*], [*Publisher or institution*], [*Type*], [*ISSN-L*], [*Impact factor*], [*h-index*], [*Is OA*],
|
|
10
|
-
|
|
11
|
-
// Content
|
|
12
|
-
{% for source in report.sources_summary.sources %}
|
|
13
|
-
[3.{{ loop.index }}. #label("source_{{ source.id.path.rpartition("/")[2] }}")],
|
|
14
|
-
[#underline([#link("{{ source.homepage_url }}")[#"{{ source.display_name }}"]])],
|
|
15
|
-
[{{ source.host_organization_name or "-" }}],
|
|
16
|
-
[{{source.type }}],
|
|
17
|
-
[{{ source.issn_l or "-" }}],
|
|
18
|
-
[{{ source.summary_stats.two_yr_mean_citedness|round(3) }}],
|
|
19
|
-
[{{ source.summary_stats.h_index }}],
|
|
20
|
-
[{% if source.is_oa %}#text(rgb(SUCCESS))[True]{% else %}#text(rgb(ERROR))[False]{% endif %}],
|
|
21
|
-
{% endfor %}
|
|
22
|
-
)
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
// Works
|
|
2
|
-
= Works.
|
|
3
|
-
|
|
4
|
-
#let works_metrics_card(title: "Title", graph, body) = {
|
|
5
|
-
grid(
|
|
6
|
-
rows: (18pt, 175pt, 60pt),
|
|
7
|
-
columns: 100%,
|
|
8
|
-
|
|
9
|
-
[
|
|
10
|
-
#block(width: 100%, height: 100%)[
|
|
11
|
-
#align(center + horizon)[#text(style: "italic")[#title]]
|
|
12
|
-
]
|
|
13
|
-
],
|
|
14
|
-
[
|
|
15
|
-
#block(width: 100%, height: 100%)[
|
|
16
|
-
#align(center + horizon)[#graph]
|
|
17
|
-
]
|
|
18
|
-
],
|
|
19
|
-
[
|
|
20
|
-
#block(width: 100%, height: 100%, inset: (x: 0pt, y: 10pt))[#body]
|
|
21
|
-
],
|
|
22
|
-
)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
#grid(
|
|
26
|
-
columns: (1fr, 1fr, 1fr),
|
|
27
|
-
column-gutter: 15pt,
|
|
28
|
-
[
|
|
29
|
-
#let graph = {
|
|
30
|
-
canvas(length: 35%, {
|
|
31
|
-
chart.piechart(
|
|
32
|
-
(
|
|
33
|
-
{{ report.citation_summary.type_a_count }}, // Type A
|
|
34
|
-
{{ report.citation_summary.type_b_count }} // Type B
|
|
35
|
-
),
|
|
36
|
-
radius: 1,
|
|
37
|
-
slice-style: (PALETTE.at(0), PALETTE.at(1)),
|
|
38
|
-
outer-label: (content: "%", radius: 115%),
|
|
39
|
-
)
|
|
40
|
-
})
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
#works_metrics_card(title: "Citation metrics", graph)[
|
|
44
|
-
#grid(
|
|
45
|
-
rows: auto, row-gutter: 10pt,
|
|
46
|
-
columns: (1fr, 1fr),
|
|
47
|
-
|
|
48
|
-
grid.cell(colspan: 2)[
|
|
49
|
-
*Count:* {{ report.citation_summary.type_a_count + report.citation_summary.type_b_count }}
|
|
50
|
-
],
|
|
51
|
-
[#box(height: 7pt, width: 7pt, fill: PALETTE.at(0)) *Type A:* {{ report.citation_summary.type_a_count }}],
|
|
52
|
-
[#box(height: 7pt, width: 7pt, fill: PALETTE.at(1)) *Type B:* {{ report.citation_summary.type_b_count }}],
|
|
53
|
-
)
|
|
54
|
-
]
|
|
55
|
-
],
|
|
56
|
-
[
|
|
57
|
-
#let graph = {
|
|
58
|
-
canvas(length: 35%, {
|
|
59
|
-
chart.columnchart(
|
|
60
|
-
size: (2.45, 2.0),
|
|
61
|
-
y-grid: false,
|
|
62
|
-
bar-style: palette.new(
|
|
63
|
-
base: (stroke: none, fill: none),
|
|
64
|
-
colors: PALETTE
|
|
65
|
-
),
|
|
66
|
-
(
|
|
67
|
-
{% for work_type in report.works_type_summary[:4] %}
|
|
68
|
-
("{{ work_type.type_name[:2]|capitalize }}", {{ work_type.count }}),
|
|
69
|
-
{% endfor %}
|
|
70
|
-
)
|
|
71
|
-
)
|
|
72
|
-
})
|
|
73
|
-
}
|
|
74
|
-
#works_metrics_card(title: "Work Type", graph)[
|
|
75
|
-
#grid(
|
|
76
|
-
rows: auto, row-gutter: 10pt,
|
|
77
|
-
columns: (1fr, 1fr),
|
|
78
|
-
column-gutter: 5pt,
|
|
79
|
-
|
|
80
|
-
grid.cell(colspan: 2)[
|
|
81
|
-
*Count:* {{ report.open_access_summary.model_dump().items()|sum(attribute="1") }}
|
|
82
|
-
],
|
|
83
|
-
|
|
84
|
-
{% for work_type in report.works_type_summary[:4] %}
|
|
85
|
-
[
|
|
86
|
-
#box(height: 7pt, width: 7pt, fill: PALETTE.at({{ loop.index0 }})) *{{ work_type.type_name|capitalize }}:* {{ work_type.count }}
|
|
87
|
-
],
|
|
88
|
-
{% endfor %}
|
|
89
|
-
)
|
|
90
|
-
]
|
|
91
|
-
],
|
|
92
|
-
[
|
|
93
|
-
#let graph = {
|
|
94
|
-
canvas(length: 35%, {
|
|
95
|
-
chart.piechart(
|
|
96
|
-
(
|
|
97
|
-
{{report.open_access_summary.diamond}}, // diamond
|
|
98
|
-
{{report.open_access_summary.gold}}, // Gold
|
|
99
|
-
{{report.open_access_summary.green}}, // Green
|
|
100
|
-
{{report.open_access_summary.hybrid}}, // Hybrid
|
|
101
|
-
{{report.open_access_summary.bronze}}, // Bronze
|
|
102
|
-
{{report.open_access_summary.closed}}, // Closed
|
|
103
|
-
),
|
|
104
|
-
radius: 1,
|
|
105
|
-
inner-radius: .4,
|
|
106
|
-
slice-style: (PALETTE.at(0), PALETTE.at(3), PALETTE.at(1), PALETTE.at(4), PALETTE.at(5), PALETTE.at(2)),
|
|
107
|
-
outer-label: (content: "%", radius: 115%),
|
|
108
|
-
)
|
|
109
|
-
})
|
|
110
|
-
}
|
|
111
|
-
#works_metrics_card(title: "Open Access", graph)[
|
|
112
|
-
#grid(
|
|
113
|
-
rows: auto, row-gutter: 10pt,
|
|
114
|
-
columns: (1fr, 1fr, 1fr),
|
|
115
|
-
column-gutter: 5pt,
|
|
116
|
-
|
|
117
|
-
grid.cell(colspan: 3)[
|
|
118
|
-
*Count:* {{ report.open_access_summary.model_dump().items()|sum(attribute="1") }}
|
|
119
|
-
],
|
|
120
|
-
|
|
121
|
-
[#box(height: 7pt, width: 7pt, fill: PALETTE.at(0)) *Diamond:* {{report.open_access_summary.diamond}}],
|
|
122
|
-
[#box(height: 7pt, width: 7pt, fill: PALETTE.at(3)) *Gold:* {{report.open_access_summary.gold}}],
|
|
123
|
-
[#box(height: 7pt, width: 7pt, fill: PALETTE.at(1)) *Green:* {{report.open_access_summary.green}}],
|
|
124
|
-
[#box(height: 7pt, width: 7pt, fill: PALETTE.at(5)) *Bronze:* {{report.open_access_summary.bronze}}],
|
|
125
|
-
[#box(height: 7pt, width: 7pt, fill: PALETTE.at(2)) *Closed:* {{report.open_access_summary.closed}}],
|
|
126
|
-
[#box(height: 7pt, width: 7pt, fill: PALETTE.at(4)) *Hybrid:* {{report.open_access_summary.hybrid}}],
|
|
127
|
-
)
|
|
128
|
-
]
|
|
129
|
-
],
|
|
130
|
-
)
|
|
131
|
-
|
|
132
|
-
#align(center, text(11pt)[Works from {{ report.works[0].work.publication_year }} to {{ report.works[-1].work.publication_year }}])
|
|
133
|
-
#table(
|
|
134
|
-
columns: (auto, 3fr, auto, auto, auto, auto, auto, auto, auto),
|
|
135
|
-
inset: 8pt,
|
|
136
|
-
align: horizon,
|
|
137
|
-
// Headers
|
|
138
|
-
[], [*Title*], [*Type*], [*DOI*], [*Publication Date*], [*Cited by count*], [*Type A*], [*Type B*], [*OA*],
|
|
139
|
-
|
|
140
|
-
// Content
|
|
141
|
-
{% for work in report.works %}
|
|
142
|
-
[#underline([#link(label("work_{{ loop.index }}"))[@work_{{ loop.index }}]])],
|
|
143
|
-
[#"{{ work.work.title.replace('"', '\\"') }}"],
|
|
144
|
-
[{{ work.work.type }}],
|
|
145
|
-
[{% if work.work.ids.doi %}#underline([#link("{{ work.work.ids.doi }}")[DOI]]){% else %}-{% endif %}],
|
|
146
|
-
[{{ work.work.publication_date }}],
|
|
147
|
-
[{{ work.citation_summary.type_a_count + work.citation_summary.type_b_count }}],
|
|
148
|
-
[{{ work.citation_summary.type_a_count }}],
|
|
149
|
-
[{{ work.citation_summary.type_b_count }}],
|
|
150
|
-
[{{ work.work.open_access.oa_status.value }}],
|
|
151
|
-
|
|
152
|
-
{% endfor %}
|
|
153
|
-
)
|
|
154
|
-
#pagebreak()
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
{% for work in report.works %}
|
|
2
|
-
|
|
3
|
-
{% if not loop.first %}
|
|
4
|
-
#pagebreak()
|
|
5
|
-
{% endif %}
|
|
6
|
-
|
|
7
|
-
== #text()[#"{{ work.work.title.replace('"', '\\"') }}"] <work_{{ loop.index }}>
|
|
8
|
-
|
|
9
|
-
#linebreak()
|
|
10
|
-
|
|
11
|
-
{% if work.work.abstract %}
|
|
12
|
-
#text()[#"{{ work.work.abstract.replace('"', '\\"')|truncate(1000) }}"]
|
|
13
|
-
|
|
14
|
-
#linebreak()
|
|
15
|
-
|
|
16
|
-
{% endif %}
|
|
17
|
-
|
|
18
|
-
// Cards
|
|
19
|
-
#grid(
|
|
20
|
-
columns: (1fr, 1fr, 1fr),
|
|
21
|
-
column-gutter: 30pt,
|
|
22
|
-
[
|
|
23
|
-
#align(center)[_Authorships_]
|
|
24
|
-
#parbreak()
|
|
25
|
-
{% for authorship in work.work.authorships[:10] %}
|
|
26
|
-
- *{{ authorship.author_position }}:* #underline([#link("{{ authorship.author.orcid or authorship.author.id }}")[#text({% if authorship.author.display_name == report.author.display_name %}rgb(SUCCESS){% endif %})[{{ authorship.author.display_name }}]]])
|
|
27
|
-
{% endfor %}
|
|
28
|
-
{% if work.work.authorships|length > 10 %}
|
|
29
|
-
- *...*
|
|
30
|
-
{% endif %}
|
|
31
|
-
],
|
|
32
|
-
[
|
|
33
|
-
#align(center)[_Open Access_]
|
|
34
|
-
#parbreak()
|
|
35
|
-
- *Status:* {{ work.work.open_access.oa_status.value }}
|
|
36
|
-
{% if work.work.open_access.oa_url %}- *URL:* #underline([#link("{{ work.work.open_access.oa_url }}")[{{ work.work.open_access.oa_url }}]]){% endif %}
|
|
37
|
-
],
|
|
38
|
-
[
|
|
39
|
-
#align(center)[_Citation_]
|
|
40
|
-
#parbreak()
|
|
41
|
-
- *Count:* {{ work.citation_summary.type_a_count + work.citation_summary.type_b_count }}
|
|
42
|
-
- *Type A:* {{ work.citation_summary.type_a_count }}
|
|
43
|
-
- *Type B:* {{ work.citation_summary.type_b_count }}
|
|
44
|
-
],
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
#linebreak()
|
|
48
|
-
|
|
49
|
-
// Cited by Table
|
|
50
|
-
{% if work.cited_by %}
|
|
51
|
-
#align(center, text(11pt)[_Cited by_])
|
|
52
|
-
#table(
|
|
53
|
-
columns: (auto, 3fr, auto, auto, auto, auto, auto),
|
|
54
|
-
inset: 8pt,
|
|
55
|
-
align: horizon,
|
|
56
|
-
// Headers
|
|
57
|
-
[], [*Title*], [*Type*], [*DOI*], [*Cite Type*], [*Publication Date*], [*Cited by count*],
|
|
58
|
-
|
|
59
|
-
// Content
|
|
60
|
-
{% for cited_by_work in work.cited_by %}
|
|
61
|
-
[{{ loop.index }}],
|
|
62
|
-
[#"{{ cited_by_work.work.title.replace('"', '\\"') }}"],
|
|
63
|
-
[{{ cited_by_work.work.type }}],
|
|
64
|
-
[{% if cited_by_work.work.ids.doi %}#underline([#link("{{ cited_by_work.work.ids.doi }}")[DOI]]){% else %}-{% endif %}],
|
|
65
|
-
[{% if cited_by_work.citation_type.value == 0 %}#text(rgb(SUCCESS))[Type A]{% else %}#text(rgb(ERROR))[Type B]{% endif %}],
|
|
66
|
-
[{{ cited_by_work.work.publication_date }}],
|
|
67
|
-
[{{ cited_by_work.work.cited_by_count }}],
|
|
68
|
-
{% endfor %}
|
|
69
|
-
)
|
|
70
|
-
{% endif %}
|
|
71
|
-
|
|
72
|
-
// Sources Table
|
|
73
|
-
{% if work.work.locations %}
|
|
74
|
-
#align(center, text(11pt)[_Sources_])
|
|
75
|
-
#table(
|
|
76
|
-
columns: (auto, 3fr, 2fr, auto, auto, auto, auto, auto),
|
|
77
|
-
inset: 8pt,
|
|
78
|
-
align: horizon,
|
|
79
|
-
// Headers
|
|
80
|
-
[], [*Name*], [*Publisher or institution*], [*Type*], [*ISSN-L*], [*Is OA*], [*License*], [*Version*],
|
|
81
|
-
|
|
82
|
-
// Content
|
|
83
|
-
{% for location in work.work.locations %}
|
|
84
|
-
{% if location.source %}
|
|
85
|
-
[#underline([#link(label("source_{{ location.source.id.path.rpartition("/")[2] }}"))[{{ loop.index }}]])],
|
|
86
|
-
[#underline([#link("{{ location.landing_page_url }}")[#"{{ location.source.display_name }}"]])],
|
|
87
|
-
[{{ location.source.host_organization_name or "-" }}],
|
|
88
|
-
[{{ location.source.type }}],
|
|
89
|
-
[{{ location.source.issn_l or "-" }}],
|
|
90
|
-
[{% if location.is_oa %}#text(rgb(SUCCESS))[True]{% else %}#text(rgb(ERROR))[False]{% endif %}],
|
|
91
|
-
[{{ location.license or "-" }}],
|
|
92
|
-
[{{ location.version.name or "-" }}],
|
|
93
|
-
{% else %}
|
|
94
|
-
[{{ loop.index }}],
|
|
95
|
-
[#underline([#link("{{ location.landing_page_url }}")[#"{{ location.landing_page_url }}"]])],
|
|
96
|
-
[-],
|
|
97
|
-
[-],
|
|
98
|
-
[-],
|
|
99
|
-
[{% if location.is_oa %}#text(rgb(SUCCESS))[True]{% else %}#text(rgb(ERROR))[False]{% endif %}],
|
|
100
|
-
[{{ location.license or "-" }}],
|
|
101
|
-
[{{ location.version.name or "-" }}],
|
|
102
|
-
{% endif %}
|
|
103
|
-
{% endfor %}
|
|
104
|
-
)
|
|
105
|
-
{% endif %}
|
|
106
|
-
|
|
107
|
-
{% endfor %}
|
|
108
|
-
|
|
109
|
-
#pagebreak()
|
|
File without changes
|
|
File without changes
|