static JSValueRef stringAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { JSStringRef attribute = 0; if (argumentCount == 1) attribute = JSValueToStringCopy(context, arguments[0], exception); JSRetainPtr<JSStringRef> stringAttributeValue(Adopt, toAXElement(thisObject)->stringAttributeValue(attribute)); JSValueRef result = JSValueMakeString(context, stringAttributeValue.get()); if (attribute) JSStringRelease(attribute); return result; }
void LitResDataParser::processState(const std::string &tag, bool closed, const char **attributes) { switch(myState) { case START: break; case CATALOG: if (!closed && TAG_BOOK == tag) { myBookId = stringAttributeValue(attributes, "hub_id"); myURLByType[NetworkItem::URL_COVER] = stringAttributeValue(attributes, "cover_preview"); std::string url = stringAttributeValue(attributes, "url"); if (!url.empty()) { myLink.rewriteUrl(url, true); // This code duplicates code in FBReader::openInBrowser and is not required myURLByType[NetworkItem::URL_HTML_PAGE] = url; } myReferences.push_back(new BookReference( "https://robot.litres.ru/pages/catalit_download_book/?art=" + myBookId, BookReference::FB2_ZIP, BookReference::DOWNLOAD_FULL_CONDITIONAL )); } break; case BOOK: if (closed && TAG_BOOK == tag) { myBooks.push_back(new NetworkBookItem( myLink, myBookId, myIndex++, myTitle, mySummary, myLanguage, myDate, myAuthors, myTags, mySeriesTitle, myIndexInSeries, myURLByType, myReferences )); myTitle.erase(); mySummary.erase(); myLanguage.erase(); myDate.erase(); mySeriesTitle.erase(); myIndexInSeries = 0; myAuthors.clear(); myTags.clear(); myURLByType.clear(); myReferences.clear(); } break; case BOOK_DESCRIPTION: break; case HIDDEN: break; case TITLE_INFO: if (!closed) { if (TAG_AUTHOR == tag) { myAuthorFirstName.clear(); myAuthorMiddleName.clear(); myAuthorLastName.clear(); } else if (TAG_SEQUENCE == tag) { mySeriesTitle = stringAttributeValue(attributes, "name"); if (!mySeriesTitle.empty()) { const char *indexInSeries = attributeValue(attributes, "number"); myIndexInSeries = indexInSeries != 0 ? atoi(indexInSeries) : 0; } } } break; case AUTHOR: if (closed && TAG_AUTHOR == tag) { NetworkBookItem::AuthorData data; if (!myAuthorFirstName.empty()) { data.DisplayName.append(myAuthorFirstName); } if (!myAuthorMiddleName.empty()) { if (!data.DisplayName.empty()) { data.DisplayName.append(" "); } data.DisplayName.append(myAuthorMiddleName); } if (!myAuthorLastName.empty()) { if (!data.DisplayName.empty()) { data.DisplayName.append(" "); } data.DisplayName.append(myAuthorLastName); } data.SortKey = myAuthorLastName; myAuthors.push_back(data); } break; case FIRST_NAME: if (closed && TAG_FIRST_NAME == tag) { ZLStringUtil::stripWhiteSpaces(myBuffer); myAuthorFirstName = myBuffer; } break; case MIDDLE_NAME: if (closed && TAG_MIDDLE_NAME == tag) { ZLStringUtil::stripWhiteSpaces(myBuffer); myAuthorMiddleName = myBuffer; } break; case LAST_NAME: if (closed && TAG_LAST_NAME == tag) { ZLStringUtil::stripWhiteSpaces(myBuffer); myAuthorLastName = myBuffer; } break; case GENRE: if (closed && TAG_GENRE == tag) { ZLStringUtil::stripWhiteSpaces(myBuffer); 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(myBuffer); 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); } } } break; case BOOK_TITLE: if (closed && TAG_BOOK_TITLE == tag) { ZLStringUtil::stripWhiteSpaces(myBuffer); myTitle = myBuffer; } break; case ANNOTATION: if (!closed) { ZLStringUtil::stripWhiteSpaces(myBuffer); if (!myBuffer.empty()) { mySummary.append(myBuffer); mySummary.append(" "); } } else { ZLStringUtil::stripWhiteSpaces(myBuffer); mySummary.append(myBuffer); int size = mySummary.size(); if (size > 0) { if (TAG_ANNOTATION == tag) { if (mySummary[size - 1] == '\n') { mySummary.erase(size - 1); } } else if ("p" == tag) { if (mySummary[size - 1] != '\n') { mySummary.append("\n"); } } else { if (!myBuffer.empty() && mySummary[size - 1] != '\n') { mySummary.append(" "); } } } } break; case DATE: if (closed && TAG_DATE == tag) { ZLStringUtil::stripWhiteSpaces(myBuffer); myDate = myBuffer; } break; case LANGUAGE: if (closed && TAG_LANGUAGE == tag) { ZLStringUtil::stripWhiteSpaces(myBuffer); myLanguage = myBuffer; } break; } }