B4A Library [B4X] [BETA] BCTextEngine / BBCodeView - Text engine + BBCode parser + Rich Text View

Discussion in 'Additional libraries, classes and official updates' started by Erel, May 28, 2019.

  1. Erel

    Erel Administrator Staff Member Licensed User

    Be open minded.


    This is a cross platform library with several features:

    - Text drawing engine.
    - Text layout engine.
    - BBCode parser.
    - Two custom views that connect everything:
    BBCodeView - multiline, scrollable with support for embedded views.
    BBLabel - lightweight label.

    The library and the code inside can be used for all kinds of things related to text. You can for example use it as an alternative to CSBuilder where you have more control over the text drawing.

    I will explain the main use case of BBCodeView.
    Our layout is usually made of boxes. The boxes positions and sizes can change, however no matter what, the content is split into boxes.

    With BBCodeView, text is the king. The text layout engine builds the layout based on the text. This is similar to html code. However, unlike html where you need to run a monstrous engine (WebView) inside your app, here there is no additional engine. BBCodeView is made of a ScrollView with an ImageView and additional views that you can add.
    This means that you don't need to anything special to interact with the internal views and you can add any view you like inside the text.

    Lets start with a simple example:
    1. Create a layout with BBCodeView.
    2. Initialize a BCTextEngine object. This should be called after the BBCodeViews and BBLabels were added.
    TextEngine.Initialize (Activity)
    BBCodeView1.Text = 
    $"Hello world!"$
    You can use all kinds of BBCode tags to format the text and add non-text elements inside.
    BBCodeView1.Text = $"[b]Hello[/b] [url]world![/url]"$

    The supported tags are:

    [b] - Bold.
    [u] - Underline.
    [Url] - Clickable link. The LinkClicked event is raised when the content is clicked. Examples:
    [Plain] - prevents the internal text from being parsed.
    [Color] - Changes the text color. Example:
    [Img] - Adds an image. Can be local or remote. Examples:

    [img dir="${File.DirInternal}" FileName="logo.png" width=50/] 'width and height are optional for local images. Omit the dir parameter for assets files.
    [img url="https://...s/l/42/42649.jpg?1432374732" width=60 height=60/] 'width and height are required for remote images.
    [Vertical] - Changes the vertical offset. Example:
    [TextSize] - Changes the text size. Example: [TextSize=25]asdasd[/TextSize]
    [Alignment] - Changes the horizontal alignment. One of the following values: Left, Right or Center.
    Example: [Alignment=Center]Title[/Alignment]
    [View] - Adds a custom view. Example:

    [Span] - Creates an unbreakable section. Supports the following keys: MinWidth and Alignment. You can use it to create columns (see the example).

    [INDENT]- Indention level. Example:
    [*]- Creates an ordered or unordered list. See the attached examples.
    [FontAwesome] and [MaterialIcons] - Inserts a FontAwesome or Material Icons icon. Example:
    Supports the following keys: Size (text size) and Vertical (vertical offset).

    View, Img, FontAwesome and MaterialIcons tags should end with /].
    You can also use vertical as a key inside View and Img tags.

    Adding views is done in two steps:
    1. Create a view and add it to BBCodeView.Views map.
    2. Add it with the View tag.

    Dim btn As Button
    btn.Text = 
    "btn", btn)
    BBCodeView1.Text = 
    $"Lets add a button here [View=btn Vertical=10/]. Do you see it?"$

    The cross platform b4xlib is attached. Note that it depends on jBitmapCreator v4.71+ which is available in B4J v7.50 and B4i v5.80.
    B4A library: https://www.b4x.com/android/forum/attachments/bitmapcreator-zip.81067/ (copy to the internal folder).
    It is recommended to use Java 9+ on B4J. You will get better results on high DPI screens.

    (The example adds a CustomListView to the layout. This can cause an issue in B4A if the layout becomes scrollable.)


    - v1.64 - New property: WordBoundariesThatCanConnectToPrevWord - sets the split characters that will be connected to the previous word. Default value is ".,:".
    - BBCodeDesigner v1.00 - B4J utility that helps with writing and testing BBCode strings:


    1.63 - Views tags support the width and height properties.
    1.62 - Adds support for Justify alignment.
    1.61 - New BBCodeView.ExternalRuns property. This allows setting the styled text directly. Usage example: https://www.b4x.com/android/forum/threads/b4x-bctextengine-parser-b4x-code-highlighter.109308/

    1.60 - Important update. Adds support for "lazy loading". In this mode the text is only drawn when it becomes visible and is removed when it becomes invisible.
    With this change it is possible to use BBCodeView to show text made of thousands of lines.
    Lazy loading is enabled by default. It is set in the designer. Uncheck this option if you want to get a single bitmap with all the text.

    1.58 - Removes the background BitmapCreator that is not used by BBCode parser.
    1.57 - BCTextEngine.WordBoundaries is now a public variable. Its default value is: "&*+-/.<>=\' ,:{}" & TAB & CRLF & Chr(13)
    You can modify it and change the list of characters that are treated as separators.
    1.56 - The '(' character is no longer considered a separator character.
    1.55 - Underline tag accepts Color and Thickness parameters:


    - Named colors are supported. Same names as available with XUI.
    1.52 - Fixes a bug with images in BBLabels.
    1.51 - Changes the way the BBLabel ImageView is set to make it possible to measure it.
    1.50 - Large update. New BBLabel custom view. This is the lightweight version of BBCodeView. It is not scrollable and doesn't handle events.
    - TextEngine.Initialize expects the parent view. It then searches the views tree for BB views and sets the engine. It is no longer needed to set the TextEngine for each view.
    - New MaterialIcons and FontAwesome tags.
    - The text can be set with the designer.
    The examples were updated.

    1.06 - New Indent and List tags.


    See the examples.

    1.05 - New Span tag. The Span tag creates an unbreakable content. It supports the following keys: MinWidth and Alignment.
    You can use it to create tables:


    Width dimensions can be set with %x units. The percentage is relative to BBCodeView width.

    1.03 - Fixes a drawing issue.
    1.02 - New BBCodeView.Padding field. Can be used to change the padding. Default value is:
    'left, top, right, bottom
    If xui.IsB4J Then
    5dip5dip20dip5dip'leaves space for the scroll bar.
    End If
    1.01 - Fixes a compilation issue in release mode.
    The Img.Dir parameter is not needed when loading files from the assets folder.

    Another example with a bit more logic is available here: https://www.b4x.com/android/forum/t...rser-rich-text-view.106207/page-2#post-665369

    Attached Files:

    Last edited: Sep 22, 2019
  2. mcqueccu

    mcqueccu Active Member Licensed User

    Wow, B4X Keeps getting better and better. This wil fit right into some projects of mine. Thanks
    Erel likes this.
  3. somed3v3loper

    somed3v3loper Well-Known Member Licensed User

    As Donmanfred's avatar appears here we should start a thread for each question :D but I should ask here why asking to be open minded ?
    emexes, peacemaker, ThRuST and 2 others like this.
  4. MarcoRome

    MarcoRome Expert Licensed User

    A word... Fantastic
  5. Erel

    Erel Administrator Staff Member Licensed User

    This is a different approach to layouts. It requires a different way of thinking.
  6. jimmyF

    jimmyF Active Member Licensed User

    This is very,very interesting.

    I was fooling around with this:
    ImageView1.Bitmap = BBCodeView1.mBase.Snapshot
  7. Erel

    Erel Administrator Staff Member Licensed User

    Version 1.01 released.
    Fixes a compilation issue in release mode.
    The Img.Dir parameter is not needed when loading files from the assets folder.
  8. imbault

    imbault Well-Known Member Licensed User

    I checkbox would be very interesting in it, possible?
  9. Erel

    Erel Administrator Staff Member Licensed User

    Sure. You can add any view you like.
    fredo, Peter Simpson and SJQ like this.
  10. Alexander Stolte

    Alexander Stolte Well-Known Member Licensed User

    Time for nice easter egs in the apps :D
  11. Sandman

    Sandman Well-Known Member Licensed User

    I'm trying to figure out a use-case for my app and need to clarify something:

    The "main" view isn't editable by the end user. However, as one can add other views inside it, those embedded views can be editable.

    Have I understood this correctly?
  12. jimmyF

    jimmyF Active Member Licensed User

    Are there other Tags available?

    I tried [i] and [p] and it crashed.
    (Had to enter the i Tag in a code box. Otherwise it changed my response to italic :D)
  13. DonManfred

    DonManfred Expert Licensed User

    The available Tags are listed in #1.
    jimmyF likes this.
  14. asales

    asales Well-Known Member Licensed User

    I'm thinking in interactive e-books and tutorials.
  15. Erel

    Erel Administrator Staff Member Licensed User

    That's true. You can add any views you like inside the layout. The text engine just leaves place holders for those views (that includes panels with complex layouts inside).
  16. jimmyF

    jimmyF Active Member Licensed User

    The CustomListView does not scroll in this update.
  17. HAH

    HAH Active Member Licensed User

    Why I got this error:
    java.lang.RuntimeException: java.lang.RuntimeException: Field bbcodeview1 was declared with the wrong type.
  18. Erel

    Erel Administrator Staff Member Licensed User

    See the note at the end of the first post. It is not a good idea to add a CustomListView in B4A if the layout is too tall. The main layout will become scrollable and other scrollable elements will not work.
    jimmyF likes this.
  19. Erel

    Erel Administrator Staff Member Licensed User

    Please start a new thread and provide more information.
  20. Sandman

    Sandman Well-Known Member Licensed User

    This view might be bit of a game-changer. All of a sudden it's possible to generate the UI on the server (just like html) and let the client render it. Which all of a sudden gives us the benefit of being able to update the app by simply updating the server, and not having to force out a new update of the app. I look forward finding time to actually test this.

    I believe Apple dislikes developers wrapping webpages and publish that as an app. In a way this could be considered doing just that. Do we think there's a risk that Apple might dislike this solution?
    fredo and xulihang like this.
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice