bivy 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +21 -0
- data/History +16 -0
- data/LICENSE +29 -0
- data/README.rdoc +37 -0
- data/Rakefile +43 -0
- data/TODO +12 -0
- data/VERSION +1 -0
- data/bin/bivy.rb +56 -0
- data/bin/pubmed_to_bivy.rb +78 -0
- data/doc/config.yaml +13 -0
- data/doc/src/default.css +126 -0
- data/doc/src/default.template +38 -0
- data/doc/src/tutorial/basic_flow.page +71 -0
- data/doc/src/tutorial/index.page +8 -0
- data/doc/src/tutorial/new_formats_and_media.page +83 -0
- data/jrn_abbrev/abbr_html.tgz +0 -0
- data/jrn_abbrev/abbr_to_journal.yaml +676 -0
- data/jrn_abbrev/download_abbrevs.rb +20 -0
- data/jrn_abbrev/for_ruby_class.rb +686 -0
- data/jrn_abbrev/html_to_yaml.rb +50 -0
- data/lib/bibliography.rb +144 -0
- data/lib/bivy.rb +4 -0
- data/lib/citation.rb +194 -0
- data/lib/format.rb +120 -0
- data/lib/format/acs.rb +88 -0
- data/lib/format/bioinformatics.rb +33 -0
- data/lib/format/bmc.rb +38 -0
- data/lib/format/jtp.rb +30 -0
- data/lib/format/mla.rb +50 -0
- data/lib/formatter.rb +276 -0
- data/lib/journal.rb +6 -0
- data/lib/journal/iso_to_full.yaml +1320 -0
- data/lib/journal/medline_to_full.yaml +7 -0
- data/lib/journal/medline_to_iso.yaml +45 -0
- data/lib/media.rb +88 -0
- data/lib/media/html.rb +65 -0
- data/lib/ooffice.rb +39 -0
- data/lib/pubmed.rb +209 -0
- data/lib/rtf.rb +217 -0
- data/old_stuff/old_list2refs.rb +103 -0
- data/old_stuff/pubmed2html.rb +119 -0
- data/old_stuff/pubmed_bib_write.rb +92 -0
- data/old_stuff/xml.tmp.xml +115 -0
- data/scripts/merge_bibs.rb +70 -0
- data/spec/bibliography_spec.rb +127 -0
- data/spec/citation_positions.odt +0 -0
- data/spec/formatter_spec.rb +14 -0
- data/spec/formatter_spec/cits_after.xml +2 -0
- data/spec/formatter_spec/cits_before.xml +2 -0
- data/spec/formatter_spec/content.xml +2 -0
- data/spec/ooffice_spec.rb +27 -0
- data/spec/pubmed_spec.rb +26 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/testfiles/doc1.odt +0 -0
- metadata +136 -0
data/lib/rtf.rb
ADDED
@@ -0,0 +1,217 @@
|
|
1
|
+
module RTF
|
2
|
+
|
3
|
+
def rtf_num_list(items, num_spacer_lines=0)
|
4
|
+
with_number = items.collect do |item|
|
5
|
+
'\par \pard\plain {\listtext\pard\plain \li283\ri0\lin283\rin0\fi-283\f2\f2\f4 2.}\ilvl0 \ltrpar\s1\ls0\li283\ri0\lin283\rin0\fi-283\rtlch\af4\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f2\fs24\lang1033{\loch\f2\fs24\lang1033\i0\b0\*\cs8\cf0\rtlch\ltrch\dbch\loch\f1\fs24\lang1033 ' + item.to_s + '}'
|
6
|
+
end
|
7
|
+
|
8
|
+
## Add spacers
|
9
|
+
spacing = ""
|
10
|
+
rtf_list_spacer = '\par \pard\plain \ltrpar\s1\li283\ri0\lin283\rin0\fi0\rtlch\af4\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f2\fs24\lang1033'
|
11
|
+
spacer_lines = []
|
12
|
+
num_spacer_lines.times do
|
13
|
+
spacer_lines.push(rtf_list_spacer)
|
14
|
+
end
|
15
|
+
if spacer_lines.size > 0
|
16
|
+
spacing = spacer_lines.join("\n")
|
17
|
+
else
|
18
|
+
spacing = ""
|
19
|
+
end
|
20
|
+
with_number.join(spacing)
|
21
|
+
end
|
22
|
+
|
23
|
+
def in_text_citation(string, font_size=7, citation_height=5)
|
24
|
+
rtf_fontsize = font_size * 2
|
25
|
+
return '{\fs' + rtf_fontsize.to_s + '{\*\updnprop10000}\up'+ citation_height.to_s + ' ' + string.to_s + '}'
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def rtf_stylesheet_insert_for_list
|
30
|
+
'{\*\cs7\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033 Numbering Symbols;}'
|
31
|
+
end
|
32
|
+
|
33
|
+
def rtf_list_header
|
34
|
+
# NOTE THE triple quotes are necessary to end up with: \'
|
35
|
+
string = '
|
36
|
+
{\*\listtable{\list\listtemplateid1
|
37
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \\\'02\\\'00.;}{\levelnumbers\\\'01;}\fi-283\li283}
|
38
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \\\'02\\\'01.;}{\levelnumbers\\\'01;}\fi-283\li567}
|
39
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \\\'02\\\'02.;}{\levelnumbers\\\'01;}\fi-283\li850}
|
40
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \\\'02\\\'03.;}{\levelnumbers\\\'01;}\fi-283\li1134}
|
41
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \\\'02\\\'04.;}{\levelnumbers\\\'01;}\fi-283\li1417}
|
42
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \\\'02\\\'05.;}{\levelnumbers\\\'01;}\fi-283\li1701}
|
43
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \\\'02\\\'06.;}{\levelnumbers\\\'01;}\fi-283\li1984}
|
44
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \\\'02\\\'07.;}{\levelnumbers\\\'01;}\fi-283\li2268}
|
45
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \\\'02\\\'08.;}{\levelnumbers\\\'01;}\fi-283\li2551}
|
46
|
+
{\*\soutlvl{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \\\'02\\\'09.;}{\levelnumbers\\\'01;}\fi-283\li2835}}\listid1}
|
47
|
+
}{\listoverridetable{\listoverride\listid1\listoverridecount0\ls0}}
|
48
|
+
|
49
|
+
'
|
50
|
+
end
|
51
|
+
|
52
|
+
# returns an rtf header string
|
53
|
+
def footer
|
54
|
+
'}'
|
55
|
+
end
|
56
|
+
# italicized text
|
57
|
+
def i(string)
|
58
|
+
if string
|
59
|
+
return '{\i\insrsid6900457 ' + string + '}'
|
60
|
+
else
|
61
|
+
return ""
|
62
|
+
end
|
63
|
+
end
|
64
|
+
# underlined text
|
65
|
+
def u(string)
|
66
|
+
if string
|
67
|
+
'{\ul\insrsid6900457\charrsid6900457 '+string+'}'
|
68
|
+
else
|
69
|
+
return ""
|
70
|
+
end
|
71
|
+
end
|
72
|
+
# bold text
|
73
|
+
def b(string)
|
74
|
+
if string
|
75
|
+
'{\b\insrsid6900457\charrsid6900457 '+string+'}'
|
76
|
+
else
|
77
|
+
return ""
|
78
|
+
end
|
79
|
+
end
|
80
|
+
# Normal text
|
81
|
+
def n(string)
|
82
|
+
if string
|
83
|
+
'{\insrsid6900457 '+string+'}'
|
84
|
+
else
|
85
|
+
return ""
|
86
|
+
end
|
87
|
+
end
|
88
|
+
# returns a normal '.'
|
89
|
+
def dot
|
90
|
+
'{\insrsid6900457 '+ '.' +'}'
|
91
|
+
end
|
92
|
+
|
93
|
+
# returns a normal '. '
|
94
|
+
def ds
|
95
|
+
'{\insrsid6900457 '+ '. ' +'}'
|
96
|
+
end
|
97
|
+
# returns a normal ' .'
|
98
|
+
def sd
|
99
|
+
'{\insrsid6900457 '+ ' .' +'}'
|
100
|
+
end
|
101
|
+
# parenthesized: adds () around the non nil strings
|
102
|
+
# NOTE: will not parenthesize nil or empty ("") string!
|
103
|
+
def para(string)
|
104
|
+
if string && string != ""
|
105
|
+
return '(' + string + ')'
|
106
|
+
else
|
107
|
+
return ""
|
108
|
+
end
|
109
|
+
end
|
110
|
+
# space of normal text
|
111
|
+
def s
|
112
|
+
'{\insrsid6900457 '+ ' ' +'}'
|
113
|
+
end
|
114
|
+
def newline(number)
|
115
|
+
string = '{\insrsid13852479' + "\n"
|
116
|
+
pars = []
|
117
|
+
number.times {pars << '\par'}
|
118
|
+
string << pars.join("\n")
|
119
|
+
string << '}'
|
120
|
+
string
|
121
|
+
end
|
122
|
+
|
123
|
+
# returns a new string with the list info embedded
|
124
|
+
def insert_list_to_header(rtf_string)
|
125
|
+
search_string = '{\stylesheet'
|
126
|
+
#puts "RTF_string: " + rtf_string + "**********"
|
127
|
+
not_interested, header = rtf_string.split(search_string)
|
128
|
+
return rtf_string unless header
|
129
|
+
new_string = ""
|
130
|
+
brack_cnt = 0
|
131
|
+
# {stuff}{stuff}{insert my stuff}}insert list stuff
|
132
|
+
nothing_left_to_do = false
|
133
|
+
header.scan(/.|\n/) do |letter|
|
134
|
+
if nothing_left_to_do
|
135
|
+
new_string << letter
|
136
|
+
next
|
137
|
+
end
|
138
|
+
if letter == "{"
|
139
|
+
brack_cnt += 1
|
140
|
+
elsif letter == '}'
|
141
|
+
brack_cnt -= 1
|
142
|
+
end
|
143
|
+
if brack_cnt < 0
|
144
|
+
new_string << rtf_stylesheet_insert_for_list
|
145
|
+
new_string << '}'
|
146
|
+
new_string << rtf_list_header
|
147
|
+
nothing_left_to_do = true
|
148
|
+
else
|
149
|
+
new_string << letter
|
150
|
+
end
|
151
|
+
end
|
152
|
+
new_rtf = [not_interested,new_string].join(search_string)
|
153
|
+
return new_rtf
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
=begin
|
160
|
+
|
161
|
+
# this is the microsoft rtf header
|
162
|
+
|
163
|
+
return '{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f119\froman\fcharset238\fprq2 Times New Roman CE;}
|
164
|
+
{\f120\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f122\froman\fcharset161\fprq2 Times New Roman Greek;}{\f123\froman\fcharset162\fprq2 Times New Roman Tur;}{\f124\froman\fcharset177\fprq2 Times New Roman (Hebrew);}
|
165
|
+
{\f125\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f126\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f127\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;
|
166
|
+
\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;
|
167
|
+
\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\*\cs10 \additive \ssemihidden
|
168
|
+
Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv
|
169
|
+
\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}}{\*\rsidtbl \rsid6900457}{\*\generator Microsoft Word 10.0.2627;}{\info
|
170
|
+
{\title This part normal}{\author john}{\operator john}{\creatim\yr2003\mo3\dy19\hr17\min13}{\revtim\yr2003\mo3\dy19\hr17\min14}{\version1}{\edmins1}{\nofpages1}{\nofwords14}{\nofchars83}{\*\company UT Austin}{\nofcharsws96}{\vern16437}}
|
171
|
+
\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1
|
172
|
+
\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot6900457 \fet0\sectd
|
173
|
+
\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4
|
174
|
+
\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}
|
175
|
+
{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
|
176
|
+
\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033'
|
177
|
+
|
178
|
+
|
179
|
+
# the oofice header
|
180
|
+
# includes formatting for lists!
|
181
|
+
def header
|
182
|
+
return '{\rtf1\ansi\deff0\adeflang1025
|
183
|
+
{\fonttbl{\f0\froman\fprq2\fcharset0 Nimbus Roman No9 L;}{\f1\froman\fprq2\fcharset0 Nimbus Roman No9 L;}{\f2\fnil\fprq2\fcharset0 Bitstream Vera Sans;}{\f3\fnil\fprq2\fcharset0 Lucidasans;}{\f4\fnil\fprq0\fcharset0 Lucidasans;}}
|
184
|
+
{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
|
185
|
+
{\stylesheet{\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033\snext1 Default;}
|
186
|
+
{\s2\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af3\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon1\snext2 Text body;}
|
187
|
+
{\s3\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon2\snext3 List;}
|
188
|
+
{\s4\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs20\lang255\ai\ltrch\dbch\af2\afs20\langfe255\ai\loch\f0\fs20\lang1033\i\sbasedon1\snext4 Caption;}
|
189
|
+
{\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033\sbasedon1\snext5 Index;}
|
190
|
+
{\*\cs7\cf0\rtlch\af3\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033 Numbering Symbols;}
|
191
|
+
}{\*\listtable{\list\listtemplateid1
|
192
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'00.;}{\levelnumbers\'01;}\fi-283\li283}
|
193
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'01.;}{\levelnumbers\'01;}\fi-283\li567}
|
194
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'02.;}{\levelnumbers\'01;}\fi-283\li850}
|
195
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'03.;}{\levelnumbers\'01;}\fi-283\li1134}
|
196
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'04.;}{\levelnumbers\'01;}\fi-283\li1417}
|
197
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'05.;}{\levelnumbers\'01;}\fi-283\li1701}
|
198
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'06.;}{\levelnumbers\'01;}\fi-283\li1984}
|
199
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'07.;}{\levelnumbers\'01;}\fi-283\li2268}
|
200
|
+
{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'08.;}{\levelnumbers\'01;}\fi-283\li2551}
|
201
|
+
{\*\soutlvl{\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow2{\leveltext \'02\'09.;}{\levelnumbers\'01;}\fi-283\li2835}}\listid1}
|
202
|
+
}{\listoverridetable{\listoverride\listid1\listoverridecount0\ls0}}
|
203
|
+
|
204
|
+
{\info{\creatim\yr2005\mo10\dy28\hr8\min49}{\revtim\yr2005\mo10\dy28\hr8\min49}{\printim\yr1601\mo1\dy1\hr0\min0}{\comment StarWriter}{\vern6450}}\deftab709
|
205
|
+
{\*\pgdsctbl
|
206
|
+
{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\pgdscnxt0 Default;}}
|
207
|
+
\paperh15840\paperw12240\margl1800\margr1800\margt1440\margb1440\sectd\sbknone\pgwsxn12240\pghsxn15840\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
|
208
|
+
\pard\plain {\listtext\pard\plain \li283\ri0\lin283\rin0\fi-283 1.}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\li283\ri0\lin283\rin0\fi-283\rtlch\af3\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033 {\loch\f0\fs24\lang1033\i0\b0 First item}
|
209
|
+
\par \pard\plain {\listtext\pard\plain \li283\ri0\lin283\rin0\fi-283 2.}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\li283\ri0\lin283\rin0\fi-283\rtlch\af3\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033 {\loch\f0\fs24\lang1033\i0\b0 Second}
|
210
|
+
\par \pard\plain {\listtext\pard\plain \li283\ri0\lin283\rin0\fi-283 3.}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\li283\ri0\lin283\rin0\fi-283\rtlch\af3\afs24\lang255\ltrch\dbch\af2\afs24\langfe255\loch\f0\fs24\lang1033 {\loch\f0\fs24\lang1033\i0\b0 Third}
|
211
|
+
\par }'
|
212
|
+
|
213
|
+
end
|
214
|
+
|
215
|
+
=end
|
216
|
+
|
217
|
+
|
@@ -0,0 +1,103 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
|
3
|
+
|
4
|
+
require 'ostruct'
|
5
|
+
require 'pubmed2html'
|
6
|
+
|
7
|
+
if ARGV.size < 2
|
8
|
+
puts "usage: #{File.basename($0)} cits.txt ref_list.txt"
|
9
|
+
exit
|
10
|
+
end
|
11
|
+
|
12
|
+
cits = ARGV[0]
|
13
|
+
reflist = ARGV[1]
|
14
|
+
|
15
|
+
outf = cits.gsub(/\.txt$/, ".html")
|
16
|
+
|
17
|
+
def read_reflist(reflist)
|
18
|
+
hashes = {}
|
19
|
+
reading = false
|
20
|
+
key = nil
|
21
|
+
File.open(reflist).each do |line|
|
22
|
+
if line !~ /[\w\d]/
|
23
|
+
reading = false
|
24
|
+
elsif reading
|
25
|
+
if line =~ /(.*) = (.*)/
|
26
|
+
ikey = $1.dup; ival = $2.dup
|
27
|
+
if ikey == "authors"
|
28
|
+
auths = ival.split(", ")
|
29
|
+
ival = []
|
30
|
+
auths.each do |auth|
|
31
|
+
last, first = auth.split(/\s+/)
|
32
|
+
ival << Author.new(last, first)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
hashes[key][ikey] = ival
|
36
|
+
end
|
37
|
+
elsif line =~ /^\d+\.\s+(.*)/
|
38
|
+
key = $1.chomp
|
39
|
+
hashes[key] = {}
|
40
|
+
reading = true
|
41
|
+
end
|
42
|
+
end
|
43
|
+
hashes
|
44
|
+
end
|
45
|
+
|
46
|
+
def cithash2html(hash)
|
47
|
+
#puts "HASH GIVIN: " + hash.to_s
|
48
|
+
ob = OpenStruct.new(hash)
|
49
|
+
#puts "OBJ: "; p ob
|
50
|
+
ob2html(ob)
|
51
|
+
end
|
52
|
+
|
53
|
+
reflist_hash = read_reflist(reflist)
|
54
|
+
|
55
|
+
#reflist_hash.each do |k,v|
|
56
|
+
# puts "****************************************"
|
57
|
+
# puts "KEY: #{k}"
|
58
|
+
# puts "****************************************"
|
59
|
+
# v.each do |kk,vv|
|
60
|
+
# puts "#{kk}: #{vv}"
|
61
|
+
# end
|
62
|
+
#end
|
63
|
+
|
64
|
+
def html_header
|
65
|
+
"<html><body><ol>"
|
66
|
+
end
|
67
|
+
|
68
|
+
def html_tail
|
69
|
+
"</ol></body></html>"
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
html_lines = []
|
74
|
+
File.open(cits).each do |line|
|
75
|
+
if line =~ /[\w\d]/ && line !~ /^[#]/
|
76
|
+
#puts "LINE: " + line
|
77
|
+
arr = line.chomp.split
|
78
|
+
# is this a pmid?
|
79
|
+
if arr[1] =~ /[^\d]/ && arr[1] != "NULL"
|
80
|
+
#puts "ARR[1]: " + arr[1]
|
81
|
+
# not a pmid
|
82
|
+
call_key = arr[1..-1].join(" ")
|
83
|
+
#puts "CALLING KEY: " + call_key
|
84
|
+
if !reflist_hash.key?(call_key)
|
85
|
+
puts "NO RESPONSE FOR #{call_key}"
|
86
|
+
exit
|
87
|
+
end
|
88
|
+
cit_hash = reflist_hash[call_key]
|
89
|
+
#p cit_hash
|
90
|
+
html_lines << cithash2html(cit_hash)
|
91
|
+
else
|
92
|
+
#pmid
|
93
|
+
html_lines << `ruby pubmed2html.rb #{arr[1]}`
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
File.open(outf, "w") do |fh|
|
99
|
+
fh.print html_header + "\n"
|
100
|
+
fh.print html_lines.join("\n")
|
101
|
+
fh.print html_tail + "\n"
|
102
|
+
end
|
103
|
+
|
@@ -0,0 +1,119 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
|
3
|
+
|
4
|
+
$jrn = {
|
5
|
+
"Anal. Chem." => "Anal. Chem.",
|
6
|
+
"Anal Chem" => "Anal. Chem.",
|
7
|
+
"Nature Methods" => "Nature Methods",
|
8
|
+
"Analytica Chimica Acta" => "Anal. Chim. Acta",
|
9
|
+
"Bioinformatics" => "Bioinformatics",
|
10
|
+
"Biomed. Mass Spectrom." => "Biomed. Mass Spectrom.",
|
11
|
+
"Biomed Mass Spectrom" => "Biomed. Mass Spectrom.",
|
12
|
+
"Environ Sci Technol" => "Environ. Sci. Technol.",
|
13
|
+
"Eur. Food Res. Technol." => "Eur. Food Res. Technol.",
|
14
|
+
"Genome Res" => "Genome Res.",
|
15
|
+
"IEEE ASSP" => "IEEE ASSP",
|
16
|
+
"J. Chemom." => "J. Chemom.",
|
17
|
+
"J Chemom" => "J. Chemom.",
|
18
|
+
"J. Mol. Biol." => "J. Mol. Biol.",
|
19
|
+
"J Mol Biol" => "J. Mol. Biol.",
|
20
|
+
"J. Am. Soc. Mass Spectrom." => "J. Am. Soc. Mass Spectrom.",
|
21
|
+
"J. Chromatogr., A" => "J. Chromatogr., A",
|
22
|
+
"J Chromatogr B Analyt Technol Biomed Life Sci" => "J. Chromatogr., B",
|
23
|
+
"J Proteome Res" => "J. Proteome Res.",
|
24
|
+
"J. Proteome Res." => "J. Proteome Res.",
|
25
|
+
"J Chromatogr A" => "J. Chromatogr., A",
|
26
|
+
"KDD Workshop on Mining Temporal and Sequential Data" => "KDD Workshop MTSD",
|
27
|
+
"Mol Cell Proteomics" => "Mol. Cell. Proteomics",
|
28
|
+
"Nat Biotechnol" => "Nat. Biotechnol.",
|
29
|
+
"Nature" => "Nature",
|
30
|
+
"Nat Chem Biol" => "Nat. Chem. Biol.",
|
31
|
+
"Nucleic Acids Res" => "Nucleic Acids Res.",
|
32
|
+
"Proteomics" => "Proteomics",
|
33
|
+
"SIAM J. Num. Anal." => "SIAM J. Num. Anal.",
|
34
|
+
"Rapid Commun Mass Spectrom" => "Rapid Commun. Mass Spectrom.",
|
35
|
+
}
|
36
|
+
|
37
|
+
$LOAD_PATH << "lib"
|
38
|
+
require 'pub_med'
|
39
|
+
require 'citation'
|
40
|
+
|
41
|
+
|
42
|
+
# takes author objects
|
43
|
+
def authors_to_list(authors)
|
44
|
+
auths = []
|
45
|
+
authors.each do |auth|
|
46
|
+
a_init = ""
|
47
|
+
if auth.initials =~ /\./
|
48
|
+
a_init = auth.initials
|
49
|
+
else
|
50
|
+
a_init = auth.initials.split("").join(".") + '.'
|
51
|
+
end
|
52
|
+
auths << auth.last + ', ' + a_init
|
53
|
+
end
|
54
|
+
auths.join("; ")
|
55
|
+
end
|
56
|
+
|
57
|
+
# ob needs to respond to authors, journal, etc
|
58
|
+
def ob2html(ob)
|
59
|
+
string = ""
|
60
|
+
if ob.respond_to?(:btype) && ob.btype != "article"
|
61
|
+
## Type specific
|
62
|
+
#puts "NON ARTICLE!"
|
63
|
+
if ob.btype == "workshop"
|
64
|
+
string = "<li>#{authors_to_list(ob.authors)} <span style=\"font-style:italic;\">#{format_journal(ob.name)}</span>. <span style=\"font-weight:bold\">#{ob.year}</span>.</li>"
|
65
|
+
|
66
|
+
else
|
67
|
+
puts "don't recognize type: #{ob.btype}"
|
68
|
+
exit
|
69
|
+
end
|
70
|
+
# Ho, M.; Pemberton, J. E. Anal. Chem.1998, 70, 4915�4920.
|
71
|
+
# (2) Bard, A. J.; Faulker, L. R. Electrochemical Methods, 2nd ed.; Wiley:
|
72
|
+
# New York; 2001.
|
73
|
+
# (3) Francesconi, K. A.; Kuehnelt, D. In Environmental Chemistry of Arsenic;
|
74
|
+
# Frankenberger, W. T., Jr., Ed.; Marcel Dekker: New York, 2002;
|
75
|
+
# pp 51�94.
|
76
|
+
|
77
|
+
else
|
78
|
+
#p ob
|
79
|
+
string = "<li>#{authors_to_list(ob.authors)} <span style=\"font-style:italic;\">#{format_journal(ob.journal)}</span>. <span style=\"font-weight:bold\">#{ob.year}</span>, <span style=\"font-style:italic;\">#{ob.vol}</span>, #{ob.pages}.</li>"
|
80
|
+
end
|
81
|
+
string
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
# journal from pubmed
|
86
|
+
def format_journal(journal)
|
87
|
+
if $jrn.key?(journal)
|
88
|
+
$jrn[journal].gsub(/(\.\.$)|(\.$)/, "")
|
89
|
+
else
|
90
|
+
puts "NO KEY FOR: #{journal}"
|
91
|
+
nil
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
if $0 == __FILE__
|
97
|
+
if ARGV.size < 1
|
98
|
+
puts "usage: #{File.basename($0)} pmid ..."
|
99
|
+
puts "outputs <li> item of the citation based on internal formatting"
|
100
|
+
exit
|
101
|
+
end
|
102
|
+
|
103
|
+
ids = ARGV.to_a
|
104
|
+
ids.each do |id|
|
105
|
+
ob = PubMed.new(id)
|
106
|
+
## FORMAT THE RESULT:
|
107
|
+
|
108
|
+
#ob.attr_as_hash.each do |k,v| puts k.to_s + " : " + v.to_s end
|
109
|
+
|
110
|
+
|
111
|
+
# Last, F.M.; Last, F.M. <i>Journ.</i> <b>YEAR</b>, <i>VOL</i>, pages-pages.
|
112
|
+
|
113
|
+
# analytical chemistry
|
114
|
+
puts ob2html(ob)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
|
@@ -0,0 +1,92 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
|
3
|
+
$LOAD_PATH.push File.join( File.dirname(__FILE__), "lib" )
|
4
|
+
|
5
|
+
###############################################################################
|
6
|
+
# John Prince
|
7
|
+
# pubmed_bib_write.rb
|
8
|
+
# Takes a list of pubmed id's, queries pubmed to get the citation,
|
9
|
+
# and outputs a rich text format (rtf) document based on the below $TEMPLATE
|
10
|
+
###############################################################################
|
11
|
+
|
12
|
+
###########################################################################
|
13
|
+
###########################################################################
|
14
|
+
# Choose the style of bibliography here:
|
15
|
+
##### Four Formatting tags:
|
16
|
+
# n = normal text
|
17
|
+
# b = bold
|
18
|
+
# i = italics
|
19
|
+
# u = underline
|
20
|
+
|
21
|
+
##### Helper tags (shouldn't go inside other tags)
|
22
|
+
# s = space (normal text)
|
23
|
+
# dot = '.'
|
24
|
+
# ds = '. '
|
25
|
+
# sd = ' .'
|
26
|
+
|
27
|
+
##### Lightweight tags (must be format still)
|
28
|
+
# para = parenthesized eg ()
|
29
|
+
|
30
|
+
# NOTE: Author list is guaranteed to end in a period!
|
31
|
+
$styles = {
|
32
|
+
'article' => 'n(author_list) + s + para(@year) + ds + b(@title) + ds + i(@journal) + ds + n(@vol + para(@issue) + ":" + @pages) + dot',
|
33
|
+
'article_to_be_submitted' => 'n(author_list) + s + b(@title) + ds + i(@journal) + ds + i("to be submitted") + dot',
|
34
|
+
'book' => 'n(author_list) + s + para(@pub_year) + ds + b(@title) + ds + i(@publisher) + dot',
|
35
|
+
'webpage' => 'b(@title) + ds + u(@href)'
|
36
|
+
}
|
37
|
+
|
38
|
+
# CITATION VARIABLES:
|
39
|
+
# the font size of the in-text citation marker
|
40
|
+
# 7 is default
|
41
|
+
CIT_FONTSIZE = 7
|
42
|
+
# the height of the in-text citation marker (range at least -7 to 7)
|
43
|
+
# 5 is probably a good height
|
44
|
+
CIT_HEIGHT = 6
|
45
|
+
# Replaces the brackets in the paper with numbered footnotes
|
46
|
+
REPLACE_CITATIONS = true
|
47
|
+
|
48
|
+
$FILE_TRAILER = "_PRETTY.rtf"
|
49
|
+
|
50
|
+
###########################################################################
|
51
|
+
###########################################################################
|
52
|
+
|
53
|
+
def usage
|
54
|
+
string =<<HERE
|
55
|
+
***************************************************************
|
56
|
+
* usage: #{File.basename($0)} file.rtf ref_file.txt *
|
57
|
+
* - change templates in the program for different formats *
|
58
|
+
***************************************************************
|
59
|
+
HERE
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
## This is a hack to fix author names with strange characters:
|
64
|
+
def correct_author_lists(citation_hash)
|
65
|
+
citation_hash[:authors].each do |auth|
|
66
|
+
auth.last.gsub!(/Pasa-Toli.*/, 'Pasa-Tolic')
|
67
|
+
auth.last.gsub!(/G.rg/, 'Gorg') # can't get this one working...
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
require 'bib_writer'
|
73
|
+
|
74
|
+
# citations will look like this:
|
75
|
+
# [pmid 123456] or [ref 23]
|
76
|
+
|
77
|
+
unless ARGV.length == 2
|
78
|
+
puts usage()
|
79
|
+
exit
|
80
|
+
end
|
81
|
+
|
82
|
+
file = ARGV[0]
|
83
|
+
ref_file = ARGV[1]
|
84
|
+
|
85
|
+
bib = BibWriter.new(file, ref_file)
|
86
|
+
bib.read_citations(REPLACE_CITATIONS, CIT_FONTSIZE, CIT_HEIGHT)
|
87
|
+
string = bib.create_bib($styles)
|
88
|
+
out = file.gsub(/\.\w+$/, $FILE_TRAILER)
|
89
|
+
File.open(out, "w") do |file|
|
90
|
+
file.print string
|
91
|
+
end
|
92
|
+
|