6da95fce5eb2cb25b072309d3f9d1f7b8f1f7077
[debian/jabref.git] / src / java / net / sf / jabref / imports / EndnoteImporter.java
1 package net.sf.jabref.imports;
2
3 import java.util.regex.Pattern;
4 import java.io.InputStream;
5 import java.io.BufferedReader;
6 import java.io.IOException;
7 import java.util.List;
8 import java.util.ArrayList;
9 import java.util.HashMap;
10 import net.sf.jabref.BibtexEntry;
11 import net.sf.jabref.Globals;
12 import net.sf.jabref.Util;
13 import net.sf.jabref.AuthorList;
14 import net.sf.jabref.BibtexFields;
15
16 /**
17  * Importer for the Refer/Endnote format.
18  *
19  * check here for details on the format
20  * http://www.ecst.csuchico.edu/~jacobsd/bib/formats/endnote.html
21  */
22 public class EndnoteImporter extends ImportFormat {
23
24     /**
25      * Return the name of this import format.
26      */
27     public String getFormatName() {
28     return "Refer/Endnote";
29     }
30
31     /*
32      *  (non-Javadoc)
33      * @see net.sf.jabref.imports.ImportFormat#getCLIId()
34      */
35     public String getCLIId() {
36       return "refer";
37     }
38
39     /**
40      * Check whether the source is in the correct format for this importer.
41      */
42     public boolean isRecognizedFormat(InputStream stream) throws IOException {
43
44     // Our strategy is to look for the "%A *" line.
45     BufferedReader in = new BufferedReader(ImportFormatReader.getReaderDefaultEncoding(stream));
46     Pattern pat1 = Pattern
47         .compile("%A .*");
48     String str;
49     while ((str = in.readLine()) != null){
50         if (pat1.matcher(str).find())
51         return true;
52     }
53     return false;
54     }
55
56     /**
57      * Parse the entries in the source, and return a List of BibtexEntry
58      * objects.
59      */
60     public List importEntries(InputStream stream) throws IOException {
61     ArrayList bibitems = new ArrayList();
62     StringBuffer sb = new StringBuffer();
63     BufferedReader in = new BufferedReader(ImportFormatReader.getReaderDefaultEncoding(stream));
64     String ENDOFRECORD = "__EOREOR__";
65
66     String str;
67     boolean first = true;
68     while ((str = in.readLine()) != null){
69         str = str.trim();
70         // if(str.equals("")) continue;
71         if (str.indexOf("%0") == 0){
72         if (first){
73             first = false;
74         }else{
75             sb.append(ENDOFRECORD);
76         }
77         sb.append(str);
78         }else sb.append(str);
79         sb.append("\n");
80     }
81
82     String[] entries = sb.toString().split(ENDOFRECORD);
83     HashMap hm = new HashMap();
84     String Author = "", Type = "", Editor = "";
85     for (int i = 0; i < entries.length; i++){
86         hm.clear();
87         Author = "";
88         Type = "";
89         Editor = "";
90         boolean IsEditedBook = false;
91         String[] fields = entries[i].substring(1).split("\n%");
92         //String lastPrefix = "";
93         for (int j = 0; j < fields.length; j++){
94         if (fields[j].length() < 3) continue;
95
96         /*
97            * Details of Refer format for Journal Article and Book:
98            *
99            * Generic Ref Journal Article Book Code Author %A Author Author Year %D
100            * Year Year Title %T Title Title Secondary Author %E Series Editor
101            * Secondary Title %B Journal Series Title Place Published %C City
102            * Publisher %I Publisher Volume %V Volume Volume Number of Volumes %6
103            * Number of Volumes Number %N Issue Pages %P Pages Number of Pages
104            * Edition %7 Edition Subsidiary Author %? Translator Alternate Title %J
105            * Alternate Journal Label %F Label Label Keywords %K Keywords Keywords
106            * Abstract %X Abstract Abstract Notes %O Notes Notes
107            */
108
109         String prefix = fields[j].substring(0, 1);
110         String val = fields[j].substring(2);
111         if (prefix.equals("A")){
112             if (Author.equals("")) Author = val;
113             else Author += " and " + val;
114         }else if (prefix.equals("E")){
115             if (Editor.equals("")) Editor = val;
116             else Editor += " and " + val;
117         }else if (prefix.equals("T")) hm.put("title", val);
118         else if (prefix.equals("0")){
119             if (val.indexOf("Journal") == 0) Type = "article";
120             else if ((val.indexOf("Book Section") == 0)) Type = "incollection";
121             else if ((val.indexOf("Book") == 0)) Type = "book";
122             else if (val.indexOf("Edited Book") == 0) {
123                 Type = "book";
124                 IsEditedBook = true;
125             }else if (val.indexOf("Conference") == 0) // Proceedings
126             Type = "inproceedings";
127             else if (val.indexOf("Report") == 0) // Techreport
128             Type = "techreport";
129             else if (val.indexOf("Review") == 0)
130                 Type = "article";
131             else if (val.indexOf("Thesis") == 0)
132                 Type = "phdthesis";
133             else Type = "misc"; //
134         }else if (prefix.equals("7")) hm.put("edition", val);
135         else if (prefix.equals("C")) hm.put("address", val);
136         else if (prefix.equals("D")) hm.put("year", val);
137         else if (prefix.equals("8")) hm.put("date", val);
138         else if (prefix.equals("J")){
139             // "Alternate journal. Let's set it only if no journal
140             // has been set with %B.
141             if (hm.get("journal") == null) hm.put("journal", val);
142         }else if (prefix.equals("B")){
143             // This prefix stands for "journal" in a journal entry, and
144             // "series" in a book entry.
145             if (Type.equals("article")) hm.put("journal", val);
146             else if (Type.equals("book") || Type.equals("inbook")) hm.put(
147                                           "series", val);
148             else /* if (Type.equals("inproceedings")) */
149             hm.put("booktitle", val);
150         }else if (prefix.equals("I")) {
151             if (Type.equals("phdthesis"))
152                 hm.put("school", val);
153             else
154                  hm.put("publisher", val);
155         }
156             // replace single dash page ranges (23-45) with double dashes (23--45):
157         else if (prefix.equals("P")) hm.put("pages", val.replaceAll("([0-9]) *- *([0-9])","$1--$2"));
158         else if (prefix.equals("V")) hm.put("volume", val);
159         else if (prefix.equals("N")) hm.put("number", val);
160         else if (prefix.equals("U")) hm.put("url", val);
161         else if (prefix.equals("O")) hm.put("note", val);
162         else if (prefix.equals("K")) hm.put("keywords", val);
163         else if (prefix.equals("X")) hm.put("abstract", val);
164         else if (prefix.equals("9")){
165             //Util.pr(val);
166             if (val.indexOf("Ph.D.") == 0) Type = "phdthesis";
167             if (val.indexOf("Masters") == 0) Type = "mastersthesis";
168         }else if (prefix.equals("F")) hm.put(BibtexFields.KEY_FIELD, Util
169                              .checkLegalKey(val));
170         }
171
172         // For Edited Book, EndNote puts the editors in the author field.
173         // We want them in the editor field so that bibtex knows it's an edited book
174         if (IsEditedBook && Editor.equals("")) {
175            Editor = Author;
176            Author = "";
177         }
178
179         //fixauthorscomma
180         if (!Author.equals("")) hm.put("author", AuthorList.fixAuthor_lastNameFirst(Author));
181         if (!Editor.equals("")) hm.put("editor", AuthorList.fixAuthor_lastNameFirst(Editor));
182         BibtexEntry b = new BibtexEntry(BibtexFields.DEFAULT_BIBTEXENTRY_ID, Globals
183                         .getEntryType(Type)); // id assumes an existing database so don't
184         // create one here
185         b.setField(hm);
186         //if (hm.isEmpty())
187         if (b.getAllFields().length > 0) bibitems.add(b);
188
189     }
190     return bibitems;
191
192     }
193
194 }