@Override public boolean startElementHandler(String tag, ZLStringMap attributes) { tag = tag.intern(); final char[] bufferContentArray = myBuffer.toString().trim().toCharArray(); final String bufferContent; if (bufferContentArray.length == 0) { bufferContent = null; } else { bufferContent = new String(bufferContentArray); } myBuffer.delete(0, myBuffer.length()); switch (myState) { case START: if (TAG_CATALOG == tag) { myState = CATALOG; } break; case CATALOG: if (TAG_BOOK == tag) { myBookId = attributes.getValue("hub_id"); myCover = attributes.getValue("cover_preview"); myReferences.add( new BookReference( "https://robot.litres.ru/pages/catalit_download_book/?art=" + myBookId, BookReference.Format.FB2_ZIP, BookReference.Type.DOWNLOAD_FULL_CONDITIONAL)); myState = BOOK; } break; case BOOK: if (TAG_TEXT_DESCRIPTION == tag) { myState = BOOK_DESCRIPTION; } break; case BOOK_DESCRIPTION: if (TAG_HIDDEN == tag) { myState = HIDDEN; } break; case HIDDEN: if (TAG_TITLE_INFO == tag) { myState = TITLE_INFO; } break; case TITLE_INFO: if (TAG_GENRE == tag) { myState = GENRE; } else if (TAG_AUTHOR == tag) { myState = AUTHOR; } else if (TAG_BOOK_TITLE == tag) { myState = BOOK_TITLE; } else if (TAG_ANNOTATION == tag) { myHtmlToString.setupTextContent(MimeTypes.MIME_TEXT_XHTML); myState = ANNOTATION; } else if (TAG_DATE == tag) { myState = DATE; } else if (TAG_LANGUAGE == tag) { myState = LANGUAGE; } else if (TAG_SEQUENCE == tag) { mySeriesTitle = attributes.getValue("name"); if (mySeriesTitle != null) { myIndexInSeries = 0; final String indexInSeries = attributes.getValue("number"); if (indexInSeries != null) { try { myIndexInSeries = Integer.parseInt(indexInSeries); } catch (NumberFormatException e) { } } } // myState = SEQUENCE; // handled through attributes without state } break; case AUTHOR: if (TAG_FIRST_NAME == tag) { myState = FIRST_NAME; } else if (TAG_MIDDLE_NAME == tag) { myState = MIDDLE_NAME; } else if (TAG_LAST_NAME == tag) { myState = LAST_NAME; } break; case ANNOTATION: myHtmlToString.processTextContent(false, tag, attributes, bufferContent); break; } return false; }
@Override public boolean endElementHandler(String tag) { tag = tag.intern(); final char[] bufferContentArray = myBuffer.toString().trim().toCharArray(); final String bufferContent; if (bufferContentArray.length == 0) { bufferContent = null; } else { bufferContent = new String(bufferContentArray); } myBuffer.delete(0, myBuffer.length()); switch (myState) { case CATALOG: if (TAG_CATALOG == tag) { myState = START; } break; case BOOK: if (TAG_BOOK == tag) { Books.add( new NetworkBookItem( Link, myBookId, myIndex++, myTitle, mySummary, // myLanguage, // myDate, myAuthors, myTags, mySeriesTitle, myIndexInSeries, myCover, myReferences)); myBookId = myTitle = /*myLanguage = myDate = */ mySeriesTitle = mySummary = myCover = null; myIndexInSeries = 0; myAuthors.clear(); myTags.clear(); myReferences.clear(); myState = CATALOG; } break; case BOOK_DESCRIPTION: if (TAG_TEXT_DESCRIPTION == tag) { myState = BOOK; } break; case HIDDEN: if (TAG_HIDDEN == tag) { myState = BOOK_DESCRIPTION; } break; case TITLE_INFO: if (TAG_TITLE_INFO == tag) { myState = HIDDEN; } break; case AUTHOR: if (TAG_AUTHOR == tag) { StringBuilder displayName = new StringBuilder(); if (myAuthorFirstName != null) { displayName.append(myAuthorFirstName).append(" "); } if (myAuthorMiddleName != null) { displayName.append(myAuthorMiddleName).append(" "); } if (myAuthorLastName != null) { displayName.append(myAuthorLastName).append(" "); } myAuthors.add( new NetworkBookItem.AuthorData(displayName.toString().trim(), myAuthorLastName)); myAuthorFirstName = null; myAuthorMiddleName = null; myAuthorLastName = null; myState = TITLE_INFO; } break; case FIRST_NAME: if (TAG_FIRST_NAME == tag) { myAuthorFirstName = bufferContent; myState = AUTHOR; } break; case MIDDLE_NAME: if (TAG_MIDDLE_NAME == tag) { myAuthorMiddleName = bufferContent; myState = AUTHOR; } break; case LAST_NAME: if (TAG_LAST_NAME == tag) { myAuthorLastName = bufferContent; myState = AUTHOR; } break; case GENRE: if (TAG_GENRE == tag) { /*if (bufferContent != null) { const std::map<std::string,shared_ptr<LitResGenre> > &genresMap = LitResGenreMap::Instance().genresMap(); const std::map<shared_ptr<LitResGenre>,std::string> &genresTitles = LitResGenreMap::Instance().genresTitles(); std::map<std::string, shared_ptr<LitResGenre> >::const_iterator it = genresMap.find(bufferContent); if (it != genresMap.end()) { std::map<shared_ptr<LitResGenre>, std::string>::const_iterator jt = genresTitles.find(it->second); if (jt != genresTitles.end()) { myTags.push_back(jt->second); } } }*/ myState = TITLE_INFO; } break; case BOOK_TITLE: if (TAG_BOOK_TITLE == tag) { myTitle = bufferContent; myState = TITLE_INFO; } break; case ANNOTATION: if (TAG_ANNOTATION == tag) { mySummary = myHtmlToString.finishTextContent(bufferContent); myState = TITLE_INFO; } else { myHtmlToString.processTextContent(true, tag, null, bufferContent); } break; case DATE: if (TAG_DATE == tag) { // myDate = bufferContent; myState = TITLE_INFO; } break; case LANGUAGE: if (TAG_LANGUAGE == tag) { // myLanguage = bufferContent; myState = TITLE_INFO; } break; } return false; }