Package net.sf.jabref.export.layout.format.plugin

Source Code of net.sf.jabref.export.layout.format.plugin.NameFormat

package net.sf.jabref.export.layout.format.plugin;

import net.sf.jabref.AuthorList;
import net.sf.jabref.BibtexEntry;
import net.sf.jabref.bst.BibtexNameFormatter;
import net.sf.jabref.export.layout.LayoutFormatter;

/**
* This layout formatter uses the Bibtex name.format$ method and provides ultimate flexibility:
*
* The formatter needs a parameter to be passed in that follows the following format:
*
* <case1>@<range11>@"<format>"@<range12>@"<format>"@<range13>...@@
*
* <case2>@<range21>@... and so on.
*
* Individual cases are separated by @@ and items in a case by @.
*
* Cases are just integers or the character * and will tell the formatter to apply the following formats if there are
* less or equal authors given to it. The cases must be in strict increasing order with the * in the last position.
*
* For instance:
*
* case1 = 2
* case2 = 3
* case3 = *
*
* Ranges are either <integer>..<integer>, <integer> or the character * using a 1 based index for indexing
* authors from the given authorlist. Integer indexes can be negative to denote them to start from
* the end of the list where -1 is the last author.
*
* For instance with an authorlist of "Joe Doe and Mary Jane and Bruce Bar and Arthur Kay":
*
* 1..3 will affect Joe, Mary and Bruce
*
* 4..4 will affect Arthur
*
* * will affect all of them
*
* 2..-1 will affect Mary, Bruce and Arthur
*
* The <format> uses the Bibtex formatter format:
*
* The four letter v, f, l, j indicate the name parts von, first, last, jr which
* are used within curly braces. A single letter v, f, l, j indicates that the name should be abbreviated.
* To put a quote in the format string quote it using \" (mh. this doesn't work yet)
*
* I give some examples but would rather point you to the bibtex documentation.
*
* "{ll}, {f}." Will turn "Joe Doe" into "Doe, J."
*
* Complete example:
*
* To turn:
*
* "Joe Doe and Mary Jane and Bruce Bar and Arthur Kay"
*
* into
*
* "Doe, J., Jane, M., Bar, B. and Kay, A."
*
* you would use
*
* 1@*@{ll}, {f}.@@2@1@{ll}, {f}.@2@ and {ll}, {f}.@@*@1..-3@{ll}, {f}., @-2@{ll}, {f}.@-1@ and {ll}, {f}.
*
* Yeah this is trouble-some to write, but should work.
*
* For more examples see the test-cases.
*
* @author $Author: coezbek $
* @version $Revision: 2186 $ ($Date: 2007-07-19 03:35:35 +0200 (Thu, 19 Jul 2007) $)
*
*/
public class NameFormat implements LayoutFormatter {

  public static final String DEFAULT_FORMAT = "1@*@{ff }{vv }{ll}{, jj}@@*@1@{ff }{vv }{ll}{, jj}@*@, {ff }{vv }{ll}{, jj}";

  public String format(String toFormat, AuthorList al, String[] formats){
   
    StringBuffer sb = new StringBuffer();
   
    int n = al.size();
   
    for (int i = 1; i <= al.size(); i++){
      for (int j = 1; j < formats.length; j+=2){
        if (formats[j].equals("*")){
          sb.append(BibtexNameFormatter.formatName(toFormat, i, formats[j+1], null));
          break;
        } else {
          String[] range = formats[j].split("\\.\\.");
         
          int s,e;
          if (range.length == 2){
            s = Integer.parseInt(range[0]);
            e = Integer.parseInt(range[1]);
          } else {
            s = e = Integer.parseInt(range[0]);
          }
          if (s < 0) s += n + 1;
          if (e < 0) e += n + 1;
          if (e < s) { int temp = e; e = s; s = temp; }

          if (s <= i && i <= e){
            sb.append(BibtexNameFormatter.formatName(toFormat, i, formats[j+1], null));
            break;
          }
        }
      }
    } 
    return sb.toString();
   
  }
 
  public String format(String toFormat, String parameters, BibtexEntry currentEntry) {
   
    AuthorList al = AuthorList.getAuthorList(toFormat);
   
    if (parameters == null || parameters.length() == 0){
      parameters = "*:*:\"{ff}{vv}{ll}{,jj} \"";
    }
   
    String[] cases = parameters.split("@@");
    for (int i = 0; i < cases.length; i++){
      String[] formatString = cases[i].split("@");
     
      if (formatString.length < 3){
        // Error
        return toFormat;
      }
     
      if (formatString[0].equals("*")){
        return format(toFormat, al, formatString);
      } else {
        if (al.size() <= Integer.parseInt(formatString[0])){
          return format(toFormat, al, formatString);
        }
      }
    }
    return toFormat;
  }

  public String format(String fieldText) {
    return format(fieldText, parameter, null);
  }

  String parameter = DEFAULT_FORMAT;
 
  public void setParameter(String parameter) {
    this.parameter = parameter;
  }
}
TOP

Related Classes of net.sf.jabref.export.layout.format.plugin.NameFormat

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.