/** * Extract the text from a HTML based string. This is similar to what HTML.fromHtml(...) does, but * this method also removes the embedded images instead of replacing them by a small rectangular * representation character. * * @param html * @return */ public static String extractText(CharSequence html) { String result = html.toString(); // recognize images in textview HTML contents if (html instanceof Spanned) { Spanned text = (Spanned) html; Object[] styles = text.getSpans(0, text.length(), Object.class); ArrayList<Pair<Integer, Integer>> removals = new ArrayList<Pair<Integer, Integer>>(); for (Object style : styles) { if (style instanceof ImageSpan) { int start = text.getSpanStart(style); int end = text.getSpanEnd(style); removals.add(Pair.of(start, end)); } } // sort reversed and delete image spans Collections.sort( removals, new Comparator<Pair<Integer, Integer>>() { @Override public int compare(Pair<Integer, Integer> lhs, Pair<Integer, Integer> rhs) { return rhs.getRight().compareTo(lhs.getRight()); } }); result = text.toString(); for (Pair<Integer, Integer> removal : removals) { result = result.substring(0, removal.getLeft()) + result.substring(removal.getRight()); } } // some line breaks are still in the text, source is unknown return StringUtils.replace(result, "<br />", "\n").trim(); }
@Override public void onBindViewHolder(ViewHolder holder, Cursor cursor) { final boolean isFavorite = cursor.getInt(cursor.getColumnIndex(QuotesTableHelper.IS_FAVORITE)) == 1; final boolean isAuthorNonNull = null != cursor.getString(cursor.getColumnIndex(QuotesTableHelper.AUTHOR)); final String link = cursor.getString(cursor.getColumnIndex(QuotesTableHelper.LINK)); holder.setLink(link); final String title = cursor.getString(cursor.getColumnIndex(QuotesTableHelper.TITLE)); final long id = cursor.getLong(cursor.getColumnIndex(QuotesTableHelper.ID)); holder.tvPubDate.setText( DateUtil.getItemPubDate( new Date(cursor.getLong(cursor.getColumnIndex(QuotesTableHelper.PUB_DATE))))); if (isFavorite) holder.ivFavorite.setImageResource(android.R.drawable.star_big_on); else holder.ivFavorite.setImageResource(android.R.drawable.star_big_off); holder.ivFavorite.setOnClickListener( v -> QuotesTableHelper.makeFavorite(getContext(), id, !isFavorite)); if (isAuthorNonNull) { holder.tvText.setVisibility(View.GONE); holder.ivComics.setVisibility(View.VISIBLE); final String url = cursor.getString(cursor.getColumnIndex(QuotesTableHelper.DESCRIPTION)); holder.setText(url, cursor.getString(cursor.getColumnIndex(QuotesTableHelper.AUTHOR))); if (mFavorite) holder.makeClick(0, false); else holder.makeClick(cursor.getLong(cursor.getColumnIndex(QuotesTableHelper.ID)), true); Picasso.with(getContext()).load(url).config(Bitmap.Config.ALPHA_8).into(holder.ivComics); holder.tvTitle.setText(cursor.getString(cursor.getColumnIndex(QuotesTableHelper.AUTHOR))); } else { holder.tvText.setVisibility(View.VISIBLE); holder.ivComics.setVisibility(View.GONE); String description = cursor.getString(cursor.getColumnIndex(QuotesTableHelper.DESCRIPTION)); if (!description.contains("\n")) { Spanned text = Html.fromHtml(description); holder.tvText.setText(highlightTextileNeeded(text.toString())); holder.setText(text.toString(), null); } else { holder.tvText.setText(highlightTextileNeeded(description)); holder.setText(description, null); } holder.tvTitle.setText(title); holder.tvTitle.setOnClickListener( v -> { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link)); getContext().startActivity(intent); }); } }
private void updateTextView(View bookView, Integer id, String value) { TextView textView = (TextView) bookView.findViewById(id); if (isBlankOrNull(value)) { textView.setVisibility(View.GONE); } else { textView.setVisibility(View.VISIBLE); Spanned markUp = Html.fromHtml(value); textView.setText(markUp.toString()); } }
private static CharSequence removeJumpingBeansSpans(Spanned text) { SpannableStringBuilder sbb = new SpannableStringBuilder(text.toString()); Object[] spans = text.getSpans(0, text.length(), Object.class); for (Object span : spans) { if (!(span instanceof JumpingBeansSpan)) { sbb.setSpan(span, text.getSpanStart(span), text.getSpanEnd(span), text.getSpanFlags(span)); } } return sbb; }
@Override public CharSequence filter( CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { try { int input = Integer.parseInt(dest.toString() + source.toString()); if (isInRange(min, max, input)) return null; } catch (NumberFormatException nfe) { } return ""; }
public CharSequence filter( CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { Log.d( TAG, "source:" + source + " start:" + start + " end:" + end + " dest:" + dest + " dstart:" + dstart + " dend:" + dend); String s = source.toString(); // for(int i=0;i<s.length();i++){ // int c=s.charAt(i); // if(c!=','&&(c<'0'||c>'9')){ // return ""; // } // } int sourceCommaIndex = s.indexOf(','); if (sourceCommaIndex >= 0) { int destCommaIndex = dest.toString().indexOf(','); if (destCommaIndex >= 0) { s = s.replace(COMMA, EMPYTY); // delete all ',',because of ',' is alread in dest. } else { int sourceCommaIndex2 = s.lastIndexOf(','); if (sourceCommaIndex2 != sourceCommaIndex) { // more one ',' in source s = s.replace(COMMA, EMPYTY); } } } source = s; // if(dstart>0){ // s=dest.subSequence(0, dstart).toString()+s; // } // if(dend<dest.length()-1){ // s+=dest.subSequence(dend, dest.length()); // } Log.d(TAG, "result:" + source); return source; }
public void setText(String text) { Spanned spannedText = Html.fromHtml(text); text = spannedText.toString(); textWidth = (int) textPaint.measureText(text, 0, text.length()); boolean modifiedText = false; while (textWidth > maxX) { text = text.substring(0, text.length() - 1); textWidth = (int) textPaint.measureText(text, 0, text.length()); modifiedText = true; } if (modifiedText) text += "..."; this.text = text; textPaint.getTextBounds(text, 0, text.length(), bounds); }
@Override protected void onPostExecute(Spanned spanned) { if (mActivity != null && mActivity.getPost() != null && spanned != null) { if (mActivity.getPost().isLocalDraft()) { mTextView.setVisibility(View.VISIBLE); mWebView.setVisibility(View.GONE); mTextView.setText(spanned); } else { mTextView.setVisibility(View.GONE); mWebView.setVisibility(View.VISIBLE); mWebView.loadDataWithBaseURL( "file:///android_asset/", spanned.toString(), "text/html", "utf-8", null); } } mLoadTask = null; }
@Override public CharSequence filter( CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { String destTxt = dest.toString(); String resultingTxt = destTxt.substring(0, dstart) + source.subSequence(start, end) + destTxt.substring(dend); if (!resultingTxt.matches("^\\d{1,9}(\\.(\\d{1,2}?)?)?")) { return ""; } else { splits = resultingTxt.split("\\."); if (splits.length == 1) { userinputlistenerpointexception = false; } else { userinputlistenerpointexception = true; } } return null; }
@Override public CharSequence filter( CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if (end > start) { String destTxt = dest.toString(); String resultingTxt = destTxt.substring(0, dstart) + source.subSequence(start, end) + destTxt.substring(dend); if (!resultingTxt.matches("^\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3})?)?)?)?)?)?")) { return ""; } else { String[] splits = resultingTxt.split("\\."); for (int i = 0; i < splits.length; i++) { if (Integer.valueOf(splits[i]) > 255) { return ""; } } } } return null; }
public CharSequence filter( CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { int i; this.ch_old = dest.toString().toCharArray(); this.iallnum = 0; for (char c : this.ch_old) { this.ch_c = c; if (SysApplication.isContainsChinese(this.ch_c)) { this.iallnum += 3; } else { this.iallnum++; } } if (this.iallnum >= 30) { return ""; } this.ch_new = source.toString().toCharArray(); int keep = 0; for (i = 0; i < this.ch_new.length; i++) { this.ch_c = this.ch_new[i]; if (SysApplication.isContainsChinese(this.ch_c)) { this.iallnum += 3; } else { this.iallnum++; } if (this.iallnum > 30) { keep = i; break; } } if (this.iallnum <= 30) { return null; } if (keep == 0) { return ""; } return source.subSequence(start, start + keep); }
/* * This method is used to parse the xml file containing * the articles. * * @param InputStream input stream of the download. * * @return ArrayList<Article> list of articles parsed from file */ public ArrayList<Article> parseXml(InputStream inputStream) { XmlPullParserFactory pullParserFactory; ArrayList<Article> articles = null; String defaultImage = null; try { // Create the XmlPullParser factory and parser pullParserFactory = XmlPullParserFactory.newInstance(); XmlPullParser parser = pullParserFactory.newPullParser(); // Get the xml file and set into the parser. parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); parser.setInput(inputStream, null); int eventType = parser.getEventType(); Article currentItem = null; // kluge to take care of html to string issue. int decimal = Integer.parseInt("fffc", 16); // convert the decimal to character char tempChar = (char) decimal; // While not at the end of the document continue checking for required // items. while (eventType != XmlPullParser.END_DOCUMENT) { String name = null; switch (eventType) { case XmlPullParser.START_DOCUMENT: articles = new ArrayList<Article>(); break; case XmlPullParser.START_TAG: // Found a start tag. Check if one looking for. It item // then have a new article. If a title or content then // save the data. name = parser.getName(); if (name.equals("item")) { currentItem = new Article(); } else if (name.equals("title") && currentItem == null) { // check which feed so can set default image if one // isn't found. String temp = parser.nextText(); // Hmmm, intended to access the default image. However, // this would probably mean having to do differently. // Should probably save images to internal storage so // they can be accessed the same as cached images. if (temp.toLowerCase().contains("google")) { defaultImage = new String("google"); } else if (temp.toLowerCase().contains("yahoo")) { defaultImage = new String("yahoo"); } } else if (currentItem != null) { if (name.equals("title")) { currentItem.title = parser.nextText(); } else if (name.equals("description")) { // TODO: This should be where we pull the image from the description // and put that into the content image. Since we are already in // an async task we can do here. If trying to make reusable would // need to put into another async task. Spanned result = Html.fromHtml(parser.nextText(), null, null); currentItem.content = result.toString(); // Major hack to get rid of "obj" chars. Need to do different // if have time. currentItem.content = currentItem.content.replace(tempChar, '\0'); } else if (name.equals("pubDate")) { currentItem.date = parser.nextText(); } else if (name.equals("media:content")) { // Comment out for now since haven't downloaded images. // currentItem.imageUri = parser.getAttributeValue(null, "url"); // currentItem.imageUri = parser.nextText(); } } break; case XmlPullParser.END_TAG: // If this is an end tag check if this means end of item. // If so then save the article. name = parser.getName(); if (name.equalsIgnoreCase("item") && currentItem != null) { // If didn't find an image than use the default if (currentItem.imageUri == null) { currentItem.imageUri = defaultImage; } articles.add(currentItem); } break; case XmlPullParser.TEXT: // This is only used for checking how working. System.out.println("getting text"); } eventType = parser.next(); } System.out.println("finally done"); } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return articles; }