public void addAuthor(String name, String sortKey) { String strippedName = name; strippedName.trim(); if (strippedName.length() == 0) { return; } String strippedKey = sortKey; strippedKey.trim(); if (strippedKey.length() == 0) { int index = strippedName.lastIndexOf(' '); if (index == -1) { strippedKey = strippedName; } else { strippedKey = strippedName.substring(index + 1); while ((index >= 0) && (strippedName.charAt(index) == ' ')) { --index; } strippedName = strippedName.substring(0, index + 1) + ' ' + strippedKey; } } addAuthor(new Author(strippedName, strippedKey)); }
@Override public void readMetaInfo(Book book) throws BookReadingException { InputStream stream = null; try { stream = book.File.getInputStream(); final PdbHeader header = new PdbHeader(stream); PdbUtil.skip(stream, header.Offsets[0] + 16 - header.length()); if (PdbUtil.readInt(stream) != 0x4D4F4249) /* "MOBI" */ { throw new BookReadingException("unsupportedFileFormat", book.File); } final int length = (int) PdbUtil.readInt(stream); PdbUtil.skip(stream, 4); final int encodingCode = (int) PdbUtil.readInt(stream); final Encoding encoding = supportedEncodings().getEncoding(encodingCode); final String encodingName = encoding != null ? encoding.Name : "utf-8"; book.setEncoding(encodingName); PdbUtil.skip(stream, 52); final int fullNameOffset = (int) PdbUtil.readInt(stream); final int fullNameLength = (int) PdbUtil.readInt(stream); final int languageCode = (int) PdbUtil.readInt(stream); book.setLanguage( ZLLanguageUtil.languageByIntCode(languageCode & 0xFF, (languageCode >> 8) & 0xFF)); PdbUtil.skip(stream, 32); int offset = 132; if ((PdbUtil.readInt(stream) & 0x40) != 0) { PdbUtil.skip(stream, length - 116); offset = length + 20; if (PdbUtil.readInt(stream) == 0x45585448) /* "EXTH" */ { PdbUtil.skip(stream, 4); final int recordsNumber = (int) PdbUtil.readInt(stream); offset += 8; for (int i = 0; i < recordsNumber; ++i) { final int type = (int) PdbUtil.readInt(stream); final int size = (int) PdbUtil.readInt(stream); offset += size; if (size <= 8) { continue; } switch (type) { default: PdbUtil.skip(stream, size - 8); break; case 100: { final byte[] buffer = new byte[size - 8]; stream.read(buffer); String author = new String(buffer, encodingName); final int index = author.indexOf(','); if (index != -1) { author = author.substring(index + 1).trim() + ' ' + author.substring(0, index).trim(); } else { author = author.trim(); } book.addAuthor(author); break; } case 105: { final byte[] buffer = new byte[size - 8]; stream.read(buffer); book.addTag(new String(buffer, encodingName)); break; } } } } } PdbUtil.skip(stream, fullNameOffset - offset); final byte[] titleBuffer = new byte[fullNameLength]; stream.read(titleBuffer); book.setTitle(new String(titleBuffer, encodingName)); } catch (IOException e) { throw new BookReadingException(e, book.File); } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { } } } }
@Override public boolean endElementHandler(String tag) { switch (FB2Tag.getTagByName(tag)) { case FB2Tag.TITLE_INFO: myReadState = READ_NOTHING; break; case FB2Tag.BOOK_TITLE: if (myReadState == READ_TITLE) { myBook.setTitle(myBuffer.toString().trim()); myReadState = READ_SOMETHING; } break; case FB2Tag.GENRE: if (myReadState == READ_GENRE) { final String genre = myBuffer.toString().trim(); if (genre.length() > 0) { final ArrayList<Tag> tags = FB2TagManager.humanReadableTags(genre); if (tags != null) { for (Tag t : tags) { myBook.addTag(t); } } else { myBook.addTag(genre); } } myReadState = READ_SOMETHING; } break; case FB2Tag.AUTHOR: if (myReadState == READ_AUTHOR) { myAuthorNames[0] = myAuthorNames[0].trim(); myAuthorNames[1] = myAuthorNames[1].trim(); myAuthorNames[2] = myAuthorNames[2].trim(); String fullName = myAuthorNames[0]; if (fullName.length() != 0 && myAuthorNames[1].length() != 0) { fullName += ' '; } fullName += myAuthorNames[1]; if (fullName.length() != 0 && myAuthorNames[2].length() != 0) { fullName += ' '; } fullName += myAuthorNames[2]; myBook.addAuthor(fullName, myAuthorNames[2]); myAuthorNames[0] = ""; myAuthorNames[1] = ""; myAuthorNames[2] = ""; myReadState = READ_SOMETHING; } break; case FB2Tag.LANG: if (myReadState == READ_LANGUAGE) { myBook.setLanguage(myBuffer.toString().trim()); myReadState = READ_SOMETHING; } break; case FB2Tag.FIRST_NAME: if (myReadState == READ_AUTHOR_NAME_0) { myReadState = READ_AUTHOR; } break; case FB2Tag.MIDDLE_NAME: if (myReadState == READ_AUTHOR_NAME_1) { myReadState = READ_AUTHOR; } break; case FB2Tag.LAST_NAME: if (myReadState == READ_AUTHOR_NAME_2) { myReadState = READ_AUTHOR; } break; default: break; } myBuffer.delete(0, myBuffer.length()); return false; }
public void addAuthor(String name) { addAuthor(name, ""); }