diff --git a/.gitignore b/.gitignore index c95af7ef3..a2632ce82 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +scratch.txt *.jl.*.cov *.jl.cov *.jl.mem diff --git a/Project.toml b/Project.toml index 3a2ba5137..614b7e821 100644 --- a/Project.toml +++ b/Project.toml @@ -15,6 +15,7 @@ MyterialColors = "1c23619d-4212-4747-83aa-717207fae70f" OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" Parameters = "d96e819e-fc66-5662-9728-84c9c7592b0a" ProgressLogging = "33c8b6b6-d38a-422a-b730-caa89a2f386c" +REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" SnoopPrecompile = "66db9d55-30c0-4569-8b51-7e840670fc0c" Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" @@ -40,6 +41,7 @@ StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" Suppressor = "fd094767-a336-5f1f-9728-57cf17d0bbfb" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" [targets] test = ["Random", "StableRNGs", "Suppressor", "Test", "TimerOutputs"] diff --git a/README.jl b/README.jl index d62c01588..e968ff0cc 100644 --- a/README.jl +++ b/README.jl @@ -1,7 +1,7 @@ using Term import Term.Renderables: Renderable import Term: rint -import Term: typestree, inspect +import Term: inspect using Term.Layout import Term.Measures: height @@ -172,7 +172,7 @@ lorem1 = TextBox(_lorem; width = 62, fit = false, padding = (0, 0, 0, 0)) lorem2 = TextBox(_lorem; width = 42, fit = false, padding = (0, 0, 0, 0)) expr = :(2x + 2π / θ) -tree = Renderable(sprint(typestree, Float64)) +tree = Renderable(sprint(Tree, Float64)) dendo = Renderable(sprint(inspect, expr)) renderables_info = TextBox( """{bold bright_blue}Renderables types{/bold bright_blue} diff --git a/docs/src/adv/errors_tracebacks.md b/docs/src/adv/errors_tracebacks.md index bd05a902c..3f7bfc7aa 100644 --- a/docs/src/adv/errors_tracebacks.md +++ b/docs/src/adv/errors_tracebacks.md @@ -48,4 +48,9 @@ import Term: STACKTRACE_HIDDEN_MODULES, STACKTRACE_HIDE_FRAMES STACKTRACE_HIDDEN_MODULES[] = ["REPL", "OhMyREPL"] # list names of modules you want ignored in the stacktrace STACKTRACE_HIDE_FRAMES[] = false # set to true to hide frame, false to show all of them -``` \ No newline at end of file +<<<<<<< HEAD +``` + +======= +``` +>>>>>>> 5af6831f4379fc6bbb39622d06c91a17dcbac183 diff --git a/docs/src/api/api_live.md b/docs/src/api/api_live.md new file mode 100644 index 000000000..7a6f96825 --- /dev/null +++ b/docs/src/api/api_live.md @@ -0,0 +1,13 @@ +# Live +```@meta +CurrentModule = Term.LiveWidgets +``` + + +```@index +Pages = ["api_live.md"] +``` + +```@autodocs +Modules = [LiveWidgets] +``` \ No newline at end of file diff --git a/docs/src/layout/compositor.md b/docs/src/layout/compositor.md index 0c6c5c39f..ec71e00e6 100644 --- a/docs/src/layout/compositor.md +++ b/docs/src/layout/compositor.md @@ -1,4 +1,4 @@ -# Compositor +# [Compositor](@id CompositorDocs) We've just seen how you can use `grid` to achieve nice layouts very easily. That's great when you have a bunch of renderables of the same size and you want to crate a simple layout. If you want to get fancy using grid is not trivial: ```@example compositor @@ -90,6 +90,13 @@ Compositor(layout) easy peasy. +Some of you might argue: but this way I need to know exactly what size each element has to have in order to fit in the available terminal real estate... that's annoying! Nope, just use `Float64` as dimensions values to specify that you want to fill that fraction of the available space: +```@example compositor +layout = :(A(20, $(0.75)) * B(20, $(0.25))) +Compositor(layout) +``` + + ## Compositor content Some of you will be thinking: "this is all well and good, but I don't want to just show place holders I've got actual content!". Fair enough, so let's add some. diff --git a/docs/src/live/app_intro.md b/docs/src/live/app_intro.md new file mode 100644 index 000000000..1a5d3b07e --- /dev/null +++ b/docs/src/live/app_intro.md @@ -0,0 +1,122 @@ +# App + +The starting point of any good "live" or interactive terminal display is an `App`. The `App` takes care of generating and updating the visuals as well as taking in user input making use of it (e.g. to update the display accordingly). +An app has some content. This content is in the form of `AbstractWidget` elements. These widgets are single content elements that serve a specific function, for example displaying some text or acting as buttons etc. More on widgets later. In addition to knowing **what** is in an app, we also need to specify **how** it should look like. Specifically, how should the different widgets be layed out. So in addition to creating widgets, you will need to specify a layout for your app. +There's a lot more to apps, but for now we can start with some simple examples + +### A first example +We start with a simple example: an app that only shows one single widget. a `TextWidget` displaying a bit of text. + +```@example app +using Term +using Term.LiveWidgets + +app = App( + TextWidget(""" +The starting point of any good "live" or interactive terminal display is an `App`. The `App` takes care of generating and updating the visuals as well as taking in user input making use of it (e.g. to update the display accordingly). +An app has some content. This content is in the form of `AbstractWidget` elements. These widgets are single content elements that serve a specific function, for example displaying some text or acting as buttons etc. More on widgets later. In addition to knowing **what** is in an app, we also need to specify **how** it should look like. Specifically, how should the different widgets be layed out. So in addition to creating widgets, you will need to specify a layout for your app. +There's a lot more to apps, but for now we can start with some simple examples +""") +) + +``` + +Easy. Now to *use* the app you'd call `play(app)`. This starts an interactive session in which the app continously refreshes its display and reacts to user input until the app is exited by pressing `q` or `Esc`. +Unfortunately we can't do that here in the docs, but we can use `frame` to see what the app would look like +when we start it: + +```@example app +frame(app) +``` + +!!! tip "Ask for help" + Press `h` while using `play` to interact with an app to display a help tooltip. + +### Layout +Ok, one widget apps are not that useful. +When adding more widgets you'll eventually have to specify how to lay them out. Essentially you want to specify the space taken by the app as a whole (the width and height in the terminal) and then within that you need to specify the size of each +widgets and where they are located (e.g. widget A is to the left of B and A,B together are above C). + +To specify the layout you need to use an `Expr` like the one used for ['Compositor'](@ref CompositorDocs) content. +The expression is made of elements like `a(h, w)` where `a` is the layout element's name and `h,w` are the height and width of the element. +Note that `h` has to be an integer (the number of lines spanned by the widget) but `w` can be either `Int` (number of columns) or `Float64` with `0 < w < 1` to specify the fraction of the available space that should be used. + +For example: +```julia +:r(10, 0.5) +``` +says that the widget `r` should take up 10 lines and half of the available width. + +In addition to elements, you can use `*` and `/` to specify the relation between elements: `*` means "to the side of" and `/` means "above". +Combined with parenteses you can get some pretty complex layouts. For example: + +```@example app +layout = :( + :(( a(10, .5) * b(10, .5) )/c(10, 1)) +) +``` + +With a layout in mind you can start creating your app. +Eventually you'll need to provide some widgets too, but if you just want to check the layout (and maybe tweak it) you can +create an empty app with placeholders to visualize the position of each widget: + +```@example app +App(layout) |> frame +``` + +Note that you can always specify the `width` and `height` of the app. If you don't, the app will try to use the full terminal size. + + +!!! tip "Responsive layout" + If you use a `Float` to specify your layout elements size, the app will automatically resize the elements when the terminal + size is reduced. If you also want your app to expand to fill in the whole terminal is the terminal is enlarged, you can use + `expand` keyworad argument for `App`. + + + +### Adding widgets +To create an app with multiple widgets, you'll need the layout info as shown above and a `Dict` with +the widgets you want your app to display. The keys in the `Dict` need to match the layout elemnts names. +For example, to create an app showing two pieces of text. + +```@example app + +layout = :(a(25, .5) * b(25, .5)) + +widgets = Dict( + :a => TextWidget("""To create an app with multiple widgets, you'll need the layout info as shown above and a `Dict` with +the widgets you want your app to display. The keys in the `Dict` need to match the layout elemnts names. +For example, to create an app showing two pieces of text. +"""; as_panel=true), + :b => TextWidget(""" + The starting point of any good "live" or interactive terminal display is an `App`. The `App` takes care of generating and updating the visuals as well as taking in user input making use of it (e.g. to update the display accordingly). +An app has some content. This content is in the form of `AbstractWidget` elements. These widgets are single content elements that serve a specific function, for example displaying some text or acting as buttons etc. More on widgets later. In addition to knowing **what** is in an app, we also need to specify **how** it should look like. Specifically, how should the different widgets be layed out. So in addition to creating widgets, you will need to specify a layout for your app. +There's a lot more to apps, but for now we can start with some simple examples +"""; as_panel=true) +) + +App(layout; widgets=widgets) |> frame +``` + +Note that one panel is dim while the other is not, why? +That's because the app considers the first widget to be 'active' and the brighter color signals that. +Different widgets show that they are active differently, but generally they use colors to signal to the user that they are +the currently active one. This is important because user input's (like key presses) will be passed to the currently active widget. +For example, if you have a widget that is a button and it get's pressed by using `spacebar`, then pressing space +will only work if the button is active. + +To change the currently active widget you can "navigate" through the app using arrow keys. +`App` analyzes the `layout` of the app to infer the relative position of the wedgets and set up the navigation accordingly. +To test this, use `play` on the app we just created and then left/right arrow to change focus! +(Don't forget to use `q` to exit the app when you're done) + +Sometimes you want different ways to specify which widget should be active, either by using an arrow key or by pressing a specific key. +You can pass `transition_rules` to `App` to use your own set of rules. `transition_rules` should be a `Dict` with `KeyInput` types as key and a `Dict` of pairs `Symbol => Symbol`. The interpretation is that the symbols indicate the current and next widget to be active when the key is pressed. For example: + +```julia +transition_rules = Dict( + ArrowRight() => Dict(:a => :b), + ArrowLeft() => Dict(:b => :a), +) +``` +implements the transition rules from the example above. diff --git a/docs/src/live/intro.md b/docs/src/live/intro.md new file mode 100644 index 000000000..95783f311 --- /dev/null +++ b/docs/src/live/intro.md @@ -0,0 +1,5 @@ +# Live widgets + +Allright, making fancy terminal graphics is all good and well, but a bit boring isn't it? Wouldn't it be nice to have something more dynamics. Something that updates over times and maybe even reacts to users input? Well, that's what live widgets are for. Live widgets are a way to make your terminal application more interactive. They are a way to make your terminal application more dynamic. They are a way to make your terminal application more fun. + +Let's go. \ No newline at end of file diff --git a/docs/src/live/keyboard_input.md b/docs/src/live/keyboard_input.md new file mode 100644 index 000000000..06ae27199 --- /dev/null +++ b/docs/src/live/keyboard_input.md @@ -0,0 +1,38 @@ +# Keyboard input +Apps can capture input from the user by reading key presses and passing them to the active widget. + +Each widget must have a `controls` attribute with a dictionary mapping keys to function. +The keys of this dictionary can take one of two types: +- `Char`: a single character. Used to map a "letter" key to a function. For example `q` generally quits the app and `h` displays help. +- a `KeyInput` type like `ArrowLeft()` or `HomeKey()`. These are special keys including the arrows, page up/down, Esc, Del and SpaceBar. + + +The values of the dictionary are functions. The function should have a signature: `fn(w, k)` where `w` is the widget they are assigned to and `k` is the key that was pressed. +For example in `Pager` you can use `ArrowRight, PageDownKey` and `]` to scroll down so a function is defined as: +```julia +next_page(p::Pager, ::Union{PageDownKey,ArrowRight,Char}) +``` + +and with similar functions the `controls` for `Pager` are: +``` + +pager_controls = Dict( + ArrowRight() => next_page, + ']' => next_page, + ArrowLeft() => prev_page, + '[' => prev_page, + ArrowDown() => next_line, + '.' => next_line, + ArrowUp() => prev_line, + ',' => prev_line, + HomeKey() => home, + EndKey() => toend, + Esc() => quit, + 'q' => quit, +) +``` + +there's no restriction to which/how many control functions you should have and how they should affect your widget. +However having `quit` is generally a good idea or the user can't quit the app while that widget is active! +Different widgets will have different controls. +A widget's controls are only activated if the corresponding key is pressed while the widget is active. \ No newline at end of file diff --git a/docs/src/live/widgets.md b/docs/src/live/widgets.md new file mode 100644 index 000000000..38fd49f8e --- /dev/null +++ b/docs/src/live/widgets.md @@ -0,0 +1,118 @@ +# Widgets + +Widgets are the building blocks that `App`s are made of. +A widget is generally a single piece of content with a specific function (display text, act as a button...). + +## Predefined widgets +`Term` comes with a bunch of widgets you can already plug into your applications. +If you want to develop your own, read below. + +### TextWidget +We've seen this already, it's the simplest widget: just show some text. + + +```@example widgets +using Term.LiveWidgets + +TextWidget("Hello world!") |> frame + +``` + +unlike other widgets it doesn't have a whole lot of options, just gives you the +choice of showing just text or a panel: +```@example widgets +TextWidget("Hello world!", as_panel=true) |> frame +``` + +### InputBox +This widget is a bit more complex. It's a text input box. It's a bit like a `TextWidget` but it also allows the user to type in it. +When this widget is active, any key press get's captured and displayed as text in the widget. +As usual things like Space Bar, Enter and Del add spaces, new lines and delete characters respectively. +Make an `App` with an `InputBox` to see how it works! + +### Buttons +```@example widgets +Button("Click me please!") |> frame +``` +You can specify the color of the text and the button. You can also pass a `callback`: a `Function` that gets called +when the button is pressed. + +Normally, when pressed, a button will change its color to indicate that it has been pressed and then revert to its +original style. If you want something that acts like a toggle switch, use `ToggleButton` instead. + + + +### Menus + +The idea is simple, provide the user with some option and let them choose one. +```@example widgets +SimpleMenu(["Option 1", "Option 2", "Option 3"]) |> frame +``` + +the user can use the arrow keys to navigate the menu and press Enter to select an option. +Selecting an options quits the application and returns an integer with the index of the selected option. +`active_style, inactive_style` can be used to set the style of the currently active options while the user +navigates the menu. The `layout` options lets you choose if you want the options to be displayed horizontally or vertically. +If you want the menu elements to stand out more, you can use `ButtonsMenu`. + + +If you want to let users select more than one option at once, use `MultiSelectMenu`. It shows a checkbox like display and +users can use the space bar to toggle the state of the checkbox. + +### Pager +A pager is a widget that lets you display a lot of text in a scrollable window. +```@example widgets +Pager("This is a pager. It lets you display a lot of text in a scrollable window."^300) |> frame +``` + +You can use various keyboard inputs to navigate the pager (arrows to move up and down and to page up and down, Home and End to go to the top and bottom of the text respectively). + +You can specify the size (height and width) of the pager and if line numbers should be shown (useful to display code): + +```@example widgets +Pager("This is a pager. It lets you display a lot of text in a scrollable window."^300, height=20, width=20, line_numbers=true) |> frame +``` + + +### Gallery + +A `Gallery` is somewhat inbetween a widget and an `App`. It's a container for other widgets. +Only one widget at the time is displayed in the space taken by the `Gallery`. + +```@example widgets +g = Gallery( + [TextWidget("Hello world!"), TextWidget("Not shown")]; + height = 25, width=60, title="My gallery" +) |> frame +``` + +Use arrows to change which widget is active. + + +## Defining widgets +All widgets are subtypes of the `abstract type AbstractWidget`. +A new widget type needs to be defined as a `mutable struct` and it needs to have two obligatory fields: +```julia + internals::WidgetInternals + controls::AbstractDict +``` + +`WidgetInternals` is a struct that contains the state of the widget. It keeps track of thigns like the size +of the widget and the three callback functions `on_draw`, `on_activated` and `on_deactivated`. +These are optional functions that are called when `frame` is called on a widget or when the widget is activated or deactivated. +The activated/deactivated functions can be used to change the appearance of the widget to signal to the user that the widget is active or not. + +`controls` is a `Dict{Union{Char, KeyboardInput}, Function}` that says how keyboard inputs should be used: it maps a keyboard input to a function that gets called when that input is pressed if the widget is active. + +Other than these obligatory fields, the `struct` needs to have anything that the widget needs to work. + +Two obligatory methods need to be defined for the widget to work. +`frame(w::MyWidget; kwargs...)::AbstractRenderbles` is the function that gets called when the app's display is updated. The renderable that is returned is what gets displayed on the screen. +`on_layout_change(w::MyWidget, m::Measure)` says what should happen when the app gets resized. The `Measure` is the new size of the widget. +Usually it's enough to do something like: +```julia +on_layout_change(t::TextWidget, m::Measure) = t.internals.measure = m +``` + + +To get an idea of how to define a widget, take a look at the source code of the widgets that come with `Term`. \ No newline at end of file diff --git a/docs/src/ren/panel.md b/docs/src/ren/panel.md index bffa31747..8b5cf59c5 100644 --- a/docs/src/ren/panel.md +++ b/docs/src/ren/panel.md @@ -88,17 +88,15 @@ You can justify the panel's content to `:left, :center, :right`! ``` And style the title and subtitle, or the whole background too: ```@example panel -import Term: highlight_syntax, apply_style, do_by_line, fillin - -syntax_with_bg(t) = do_by_line(ln -> apply_style(ln, "on_red"), fillin(t) |> highlight_syntax) +import Term: highlight_syntax Panel( - syntax_with_bg(""" + highlight_syntax(""" function show_off(x) print(x) end """); - background="on_red" + background="on_black", fit=true, style="on_black" ) ``` diff --git a/docs/src/ren/tree.md b/docs/src/ren/tree.md index 68550e0ce..77bb2c4c8 100644 --- a/docs/src/ren/tree.md +++ b/docs/src/ren/tree.md @@ -19,7 +19,6 @@ As you can see, the starting point is a `Dict` with `key -> value` entries which If you have nested data, just create nested dictionaries! ```@example tree - data = Dict( "a" => 1, "b" => Int64, @@ -32,41 +31,82 @@ data = Dict( print(Tree(data)) ``` -Easy! [`Tree`](@ref) has lots of options to allow you to style it as you like: +Under the hood, `Tree` just leverages [AbstractTrees.jl](https://github.com/JuliaCollections/AbstractTrees.jl) to handle tree-like data structues, so anything that is compatible with that framework will printed as a `Tree`. + ```@example tree -print( - Tree(data, - title="my custom tree", - title_style="red", - guides_style="green", - guides_type=:boldtree - - ) -) +# expressions +Tree(:(print, (:x, :(y+1)))) |> print + +# arrays +Tree([1, [1, 2, [:a, :b, :c]]]) |> print + +# and more! ``` -And of course trees behave just like any renderable so you can create layouts with them: -```@example -import Term: Panel, Tree +Essentially `Tree` work's with `AbstractTrees` to just produce stylized output. + +!!! tip `Tree` is not a *tree* + `Tree` is an `AbstractRenderable`, it is **not** a datastructure for handling tree-like data. It's only meant to be used to *display* trees in your terminal. As such you can't do operations like finding children of nodes or getting a subtree etc. All of that should be done with `AbstractTrees` and `Tree` is only there to display the output + + +As per the note above, `Tree` is a `AbstractRenderable` type so it playes well with other renderables in term. + +```@example tree +import Term: Panel + data = Dict( "a" => 1, "b" => Int64, - "deep" => Dict( - "x" => 1, - "y" => :x - ), + "c" => (1, 2, 3), +) + +_tree = Tree(data) +_info = Panel("This is a panel\nYou can use it to explain\nwhat the contents of the\ntree are!"; width=30, height=_tree.measure.h, subtitle="description") + +print(_tree * " " *_info) + +``` + +### Styling +Easy! [`Tree`](@ref) has lots of options to allow you to style it as you like. +The style is set by the [`Theme`](@ref ThemeDocs). + +```@example tree +import Term: Theme +using MyterialColors + +# create a new theme editing the tree style +theme = Theme( + tree_mid = blue, + tree_terminator = blue, + tree_skip = blue, + tree_dash = blue, + tree_trunc = blue, + tree_pair = red_light, + tree_keys = yellow, + tree_max_leaf_width = 22, ) -tree = Tree(data) +print( + Tree(data, + theme=theme + ) +) +``` +`tree_max_leaf_width` sets the max width of the display of each leaf while the other values set the color of different elements of the `Tree`. In particular `mid`, `terminator`, `dash` refer to the lines (or guides) of the tree. +And since we're talking about `guides` you can also use different ones +```@example tree print( - ("\n" / tree) * " " * Panel(tree; fit=true) + Tree(data, + guides=:asciitree + ) ) ``` -!!! tip "Entries order" - Used `OrderedCollections.OrderedDict` instead of `Dict` if you want to specify the order of entries in the `Tree`. +there's a couple named guides style, but you can customize things even further using an `AbstractTree.TreeCharSet` if you wish. + ## TypeTree As you know, Julia allows for hierarchical types structures. Trees are for visualizing hierarchical data structures. So... diff --git a/examples/live_renderables/app_layout_only.jl b/examples/live_renderables/app_layout_only.jl new file mode 100644 index 000000000..a2e86fd32 --- /dev/null +++ b/examples/live_renderables/app_layout_only.jl @@ -0,0 +1,26 @@ +using Term +using Term.LiveWidgets +install_term_logger() +install_term_stacktrace() + +LiveWidgets.LIVE_DEBUG[] = false # set to true show extra info + +""" +Example on how to create a simple app without any specific content, +just to specify the widget's layout. +""" + +layout = :((r(10, 0.5) * g(10, 0.5)) / b(10, 1.0)) + +app = App( + layout; + expand = true, + help_message = """ +This is just an example of how to create a simple app without any specific content. + +!!! note + You can make apps too! +""", +) + +play(app) diff --git a/examples/live_renderables/example_app.jl b/examples/live_renderables/example_app.jl new file mode 100644 index 000000000..e76111354 --- /dev/null +++ b/examples/live_renderables/example_app.jl @@ -0,0 +1,92 @@ +""" +This example shows how to create a small app. + +We'll build a "color picker": the use can input three +numeric values for RGB and the resulting color gets displayed. +A button lets users select a random color. + +The app is made of a "panel" showing the color, three InputBox +to capture the RGB values and a button. +These are the steps: + +1. define layout +2. create widgets +3. create transition rules to shift focus between the widgets +""" + +using Term +using Term.LiveWidgets +using Term.Consoles +import Term.LiveWidgets: + AbstractWidget, KeyInput, ArrowRight, ArrowLeft, ArrowUp, ArrowDown, set_active +import OrderedCollections: OrderedDict +import Term: apply_style +using Term.Compositors + +# ------------------------------- app elements ------------------------------- # +# create some widgets +rgb_visualizer = TextWidget("") + +R = InputBox(title = "R value", style = "red", title_justify = :center) +G = InputBox(title = "G value", style = "green", title_justify = :center) +B = InputBox(title = "B value", style = "blue", title_justify = :center) + +button = Button("random"; color = "light_slate_grey", text_color = "white") + +widgets = OrderedDict{Symbol,AbstractWidget}( + :A => rgb_visualizer, + :R => R, + :G => G, + :B => B, + :b => button, +) + +# --------------------------------- functions -------------------------------- # +function get_color(ib::InputBox) + text = something(ib.input_text, "0") + text == "" && (text = "0") + + color = try + parse(Int, text) + catch + error("Failed to parse $text as a color") + end + return color +end + +# define a callback function to update rgb_visalizer at each frame +function update_visualizer(app::App) + r = get_color(app.widgets[:R]) + g = get_color(app.widgets[:G]) + b = get_color(app.widgets[:B]) + + viz = app.widgets[:A] + + viz.text = + "(r:$r, g:$g, b:$b)" / apply_style( + join( + repeat([" "^(viz.internals.measure.w - 4)], viz.internals.measure.h), + "\n", + ), + "on_($r, $g, $b)", + ) +end + +function set_random_color(::Button) + app.widgets[:R].input_text = string(rand(0:255)) + app.widgets[:G].input_text = string(rand(0:255)) + app.widgets[:B].input_text = string(rand(0:255)) +end + +# ------------------------------------ run ----------------------------------- # +# create app and visualize +layout = :(A(22, 0.4) * (R(6, 0.6) / G(6, 0.6) / B(6, 0.6) / b(4, 0.6))) +app = App(layout; widgets = widgets, on_draw = update_visualizer) + +button.callback = set_random_color + +play(app); + +# TODO on highlight stuff + +nothing diff --git a/examples/live_renderables/pager.jl b/examples/live_renderables/pager.jl new file mode 100644 index 000000000..fc8541af7 --- /dev/null +++ b/examples/live_renderables/pager.jl @@ -0,0 +1,41 @@ +import Term: load_code_and_highlight +using Term.LiveWidgets +import Term.Consoles: console_width + +""" +Simple example showing how to load a file's content and highlight the syntax to then +use a pager to view it in the terminal. + +Multiple pagers are visualized via a Gallry widget. +""" + +import Term.LiveWidgets: LIVE_DEBUG +LIVE_DEBUG[] = false + +filepath1 = "././src/live/abstract_widget.jl" +filepath2 = "././src/live/gallery.jl" + +gallery = Gallery( + [ + Pager( + load_code_and_highlight(filepath1); + height = 40, + title = filepath1, + line_numbers = true, + width = console_width() - 6, + ), + Pager( + load_code_and_highlight(filepath2); + height = 40, + title = filepath2, + line_numbers = true, + width = console_width() - 6, + ), + ]; + height = 50, +) + +app = App(gallery) +play(app; transient = true) + +#TODO pager update tot lines, line number... diff --git a/examples/live_renderables/simple_menu.jl b/examples/live_renderables/simple_menu.jl new file mode 100644 index 000000000..8c07ed3ba --- /dev/null +++ b/examples/live_renderables/simple_menu.jl @@ -0,0 +1,29 @@ +using Term.LiveWidgets + +println("Please choose a menu type:") +retval = + App(SimpleMenu(["Simple", "Buttons", "MultiSelect"]); height = 3) |> LiveWidgets.play +print("\n\n") + +# get the selected menu style +mn = if retval == 1 + println("\n This is an example of a SimpleMenu") + SimpleMenu(["One", "Two", "Three"]; active_style = "white bold", inactive_style = "dim") +elseif retval == 2 + println("\n This is an example of a ButtonsMenu") + ButtonsMenu( + ["One", "Two", "Three"]; + active_background = ["green", "white", "red"], + active_color = "bold black", + inactive_color = ["green", "white", "red"], + layout = :horizontal, + ) +elseif retval == 3 + println("\n This is an example of a MultiSelectMenu") + MultiSelectMenu(["One ", "two", "three"]) +end + +println("\nPlease choose an option:") +retval = LiveWidgets.play(App(mn; height = mn.internals.measure.h); transient = false) + +print("The menu returned the value: $retval") diff --git a/examples/live_renderables/tic_tac_toe.jl b/examples/live_renderables/tic_tac_toe.jl new file mode 100644 index 000000000..13dd91161 --- /dev/null +++ b/examples/live_renderables/tic_tac_toe.jl @@ -0,0 +1,179 @@ +using Term +using Term.LiveWidgets +using Term.Compositors +import Term.LiveWidgets: Esc, quit, ArrowLeft, ArrowDown, ArrowRight, ArrowUp +import Term.Style: apply_style + +""" +More advanced example of how to build a function with +a bunch of additional functionality and customization +compared to usual usage. + +The app allows the user to play tic tac toe and to read +some instructions about the game. The tic tac toe "gameborad" +is made of cells. These cells gets highlighted when activated +and the user can choose to place an X or an O in the cell. +""" + +# set layout with cells' 3x3 grid and a pager by the side +h = 9 +h2 = 3 * h - 1 +layout = :( + ( + (A($h, 0.15) * B($h, 0.15) * C($h, 0.15)) / + (D($h, 0.15) * E($h, 0.15) * F($h, 0.15)) / + (G($h, 0.15) * H($h, 0.15) * I($h, 0.15)) + ) * Z($h2, 0.55) +) + +""" +The board's cells are TextWidgets, define some function +to change the widget's text when the user draws and x or a o. +""" + +""" +write a X made of multiple line of characters +""" +x = RenderableText( + """xx xx + xx xx + xxxx + xxxx + xx xx +xx xx"""; + style = "red", +) |> string |> rstrip + +o = RenderableText( + """ oooooo + oo oo +oo oo +oo oo + oo oo + oooooo"""; + style = "blue", +) |> string |> rstrip + +""" set widget's text""" +set_text(widget, text) = + if text == 'x' + widget.text = x + else + widget.text = o + end + +""" +Define some functions to show when a cell is highlighted +""" + +function on_cell_highlighted(cell) + cell.panel_kwargs[:style] = "whie on_gray23" +end + +function on_cell_not_highlighted(cell) + cell.panel_kwargs[:style] = "dim" +end + +""" +Define keyboard controls +""" + +button_controls = Dict('x' => set_text, 'o' => set_text, 'q' => quit, Esc() => quit) + +""" +Create a widget for each cell +""" + +widgets = Dict{Symbol,Any}( + map( + c -> + c => TextWidget( + ""; + controls = button_controls, + as_panel = true, + on_activated = on_cell_highlighted, + on_deactivated = on_cell_not_highlighted, + padding = (1, 0, 0, 0), + justify = :center, + style = "dim", + ), + (:A, :B, :C, :D, :E, :F, :G, :H, :I), + )..., +) + +widgets[:Z] = Pager(""" +Tic-tac-toe, also known as noughts and crosses, +is a simple two-player game that has been enjoyed +by people of all ages for many years. The game +is played on a 3x3 grid, typically made up of +a pencil and paper or a game board. Each player +takes turns placing their symbol (an "X" or an "O") on +the grid, with the goal of getting three of their + symbols in a row, either horizontally, + vertically, or diagonally. + +The origins of tic-tac-toe are uncertain, but it +is believed to have originated in ancient Egypt, +Greece, or Roman times. The game has been played +in various forms throughout history and has been known +by different names in different cultures. The game +was known as "tic-tac-toe" in the United States in the +early 20th century, and it became popular in the 1930s. +The name "tic-tac-toe" is thought to have come from the +sound that people made when they made the X or O marks on the game board. + +Tic-tac-toe is a simple game that can be played by people +of all ages and skill levels, making it a popular pastime +for families and friends. The game is often used as a tool +for teaching basic strategic thinking and problem-solving +skills to children. It is also a popular game +to play in the classroom as an educational tool. + +In the 20th century, tic-tac-toe was adopted as a game +for computers, and the first computer game of tic-tac-toe +was developed in 1952. Since then, it has been used as +a benchmark problem for artificial intelligence research +and has been widely used to teach computer science +students the basics of game theory and artificial intelligence. + +Tic-tac-toe has evolved over time, and it's now possible to +play it on smartphones, tablets, and computers. There are also +many variations of the game, such as 3D tic-tac-toe, and +games that use a larger grid or more symbols. + +In conclusion, Tic-tac-toe is a simple but challenging +game that has been enjoyed by people for centuries. It's a +game that's easy to learn but difficult to master, making it +a popular pastime for families and friends. The game's simplicity +has also made it a popular educational tool and a benchmark +åproblem for artificial intelligence research. +""") + +""" +Define a custom set of transition rules +to specify how to move between cells +using keyboard controls. +""" + +transition_rules = Dict( + ArrowDown() => Dict(:A => :D, :B => :E, :C => :F, :D => :G, :E => :H, :F => :I), + ArrowUp() => Dict(:D => :A, :E => :B, :F => :C, :G => :D, :H => :E, :I => :F), + ArrowRight() => Dict( + :A => :B, + :B => :C, + :D => :E, + :E => :F, + :G => :H, + :H => :I, + :C => :Z, + :F => :Z, + :I => :Z, + ), + ArrowLeft() => + Dict(:B => :A, :C => :B, :E => :D, :F => :E, :H => :G, :I => :H, :Z => :A), +) + +app = App(layout; widgets = widgets, transition_rules = transition_rules) +play(app; transient = false); + +nothing diff --git a/examples/progressbars.jl b/examples/progressbars.jl index 233205c67..a55166e34 100644 --- a/examples/progressbars.jl +++ b/examples/progressbars.jl @@ -1,6 +1,7 @@ using Term import Term.Progress: ProgressBar, start!, update!, stop!, with, @track, addjob!, render import Term.Consoles: clear +using Term.LiveDisplays tprint(hLine("progress bars"; style = "blue")) @@ -21,7 +22,7 @@ for i in 1:100 update!(job) sleep(0.01) i % 25 == 0 && println("We can print from here too") - render(pbar) + LiveDisplays.refresh!(pbar) end stop!(pbar) @@ -29,7 +30,7 @@ stop!(pbar) Or with multiple jobs """ -pbar = ProgressBar() +pbar = ProgressBar(transient = true) job = addjob!(pbar; N = 100) job2 = addjob!(pbar; N = 50) job3 = addjob!(pbar; N = 25) @@ -40,7 +41,7 @@ for i in 1:100 i % 2 == 0 && update!(job2) i % 3 == 0 && update!(job3) sleep(0.01) - render(pbar) + LiveDisplays.refresh!(pbar) end stop!(pbar) @@ -62,7 +63,6 @@ with(pbar) do update!(job) sleep(0.01) i % 25 == 0 && println("We can print from here too") - render(pbar) end end @@ -193,7 +193,6 @@ import Term.Progress: SeparatorColumn, ProgressColumn, DescriptionColumn, Downlo FILESIZE = 2342341 CHUNK = 2048 nsteps = Int64(ceil(FILESIZE / CHUNK)) -@info nsteps mycols = [DescriptionColumn, SeparatorColumn, ProgressColumn, DownloadedColumn] diff --git a/examples/tree.jl b/examples/tree.jl index 798b6cff6..0ee1ae561 100644 --- a/examples/tree.jl +++ b/examples/tree.jl @@ -6,7 +6,7 @@ The easiest starting point is a `Dict` object with the info we want to show in the tree """ -import Term: Tree +import Term: Tree, Theme data = Dict("a" => 1, "b" => Int64, "c" => [1, 2, 3], "d" => "a b c"^100) @@ -17,22 +17,23 @@ print(Tree(data)) """ print("\n\n") -for guides_type in (:standardtree, :boldtree, :asciitree) - print(Tree(data; title = string(guides_type), guides_type = guides_type)) +for guides in (:standardtree, :boldtree, :asciitree) + Tree(data; guides = guides) |> print end # set the colors! print("\n\n") -print( - Tree( - data; - title = "my colors", - title_style = "bold red", - node_style = "blue underline", - leaf_style = "green", - guides_style = "red dim", - ), +theme = Theme( + tree_mid = "green", + tree_terminator = "green", + tree_skip = "green", + tree_dash = "green", + tree_trunc = "green", + tree_pair = "red", + tree_keys = "blue", + tree_max_leaf_width = 44, ) +print(Tree(data; theme = theme)) """ Tree can handle nested data too! diff --git a/logo.png b/logo.png deleted file mode 100644 index e6c46e637..000000000 Binary files a/logo.png and /dev/null differ diff --git a/src/Live/abstract_container.jl b/src/Live/abstract_container.jl new file mode 100644 index 000000000..9ef0de732 --- /dev/null +++ b/src/Live/abstract_container.jl @@ -0,0 +1,44 @@ +""" + AbstractWidgetContainer + +`AbstractWidgetContainer` contain multiple other widgets +and can coordinate their activity. +AbstractWidgetContainer must have two obligatory fields on top of AbstractWidget's fields: + widgets::Vector{AbstractWidget} + active::Int +""" +abstract type AbstractWidgetContainer <: AbstractWidget end + +""" +Set the parent of all widgets in `container` to `container`. +""" +set_as_parent(container::AbstractWidgetContainer) = map( + w -> w.internals.parent = container, + (container.widgets isa AbstractDict ? values(container.widgets) : container.widgets), +) + +""" +Return the active widget in `container`. +""" +get_active(container::AbstractWidgetContainer) = container.widgets[container.active] + +""" +Set the active widget in `container` to `active`. +""" +set_active(container::AbstractWidgetContainer, active) = container.active = active + +""" +Set the active widget in `container` to the next widget. +""" +function activate_next_widget(widget::AbstractWidget, ::Any) + widget.active = min(widget.active + 1, length(widget.widgets)) + return :stop +end + +""" +Set the active widget in `container` to the previous widget. +""" +function activate_prev_widget(widget::AbstractWidget, ::Any) + widget.active = max(widget.active - 1, 1) + return :stop +end diff --git a/src/Live/abstract_widget.jl b/src/Live/abstract_widget.jl new file mode 100644 index 000000000..94e21184d --- /dev/null +++ b/src/Live/abstract_widget.jl @@ -0,0 +1,117 @@ +# ---------------------------------------------------------------------------- # +# ABSTRACT WIDGET # +# ---------------------------------------------------------------------------- # + +""" + AbstractWidget + +Abstract widgets must have three obligatory fields: + measure::Measure + controls:: Dict{Union{KeyInput, Char}, Function} + parent::Union{Nothing, AbstractWidget} + +and one optional one + on_draw::Union{Nothing, Function} = nothing +""" +abstract type AbstractWidget end + +""" + WidgetInternals + +This struct is used to store the internal state of a widget as well as +callbacks assigned to it. +""" +mutable struct WidgetInternals + measure::Measure + parent::Union{Nothing,AbstractWidget} + on_draw::Union{Nothing,Function} + on_activated::Function + on_deactivated::Function + active::Bool +end + +# ----------------------------- widget functions ----------------------------- # +""" + get_active(w::AbstractWidget) + +Nothing: no children. +""" +get_active(::AbstractWidget) = nothing + +""" + isactive(w::AbstractWidget) + +Returns true if the widget is active, i.e. if it is the active widget +""" +function isactive(widget::AbstractWidget) + par = AbstractTrees.parent(widget) + isnothing(par) && return true + return widget == get_active(par) && isactive(par) +end + +""" +Default callback for a widget being activated +""" +on_activated(wdg::AbstractWidget) = wdg.internals.active = true + +""" +Default callback for a widget being deactivated +""" +on_deactivated(wdg::AbstractWidget) = wdg.internals.active = false + +""" +Quit the current app, potentially returning some value. +""" +function quit end +quit(::Nothing) = return +quit(widget::AbstractWidget, ::Any) = quit(AbstractTrees.parent(widget)) +quit(widget::AbstractWidget) = quit(AbstractTrees.parent(widget)) + +""" +Get the current content of a widget +""" +frame(::AbstractWidget) = error("Not implemented") + +# ------------------------------ tree structure ------------------------------ # + +""" +Methods to let the AbstractTrees API handle applications as tree +structures based on the nesting of widgets. +""" + +function AbstractTrees.children(widget::AbstractWidget) + hasfield(typeof(widget), :widgets) || return [] + widget.widgets isa AbstractDict && return collect(values(widget.widgets)) + return widget.widgets +end + +function AbstractTrees.parent(widget::AbstractWidget) + hasfield(typeof(widget), :parent) && return widget.parent + return widget.internals.parent +end + +""" + print_node(io, x) + +Print function to print a node (widget) in an application's hierarchy tree. +It prints the node's stated dimensions vs its content's (calling `frame`). +Used for debugging +""" +function print_node(io, x) + color = isactive(x) ? "bright_blue" : "dim blue" + style = isactive(x) ? "default" : "dim" + content = frame(x) + + measure = hasfield(typeof(x), :measure) ? x.measure : x.internals.measure + hx, wx = measure.h, measure.w + hc, wc = content.measure.h, content.measure.w + + h_color = hx >= hc ? style : "red" + w_color = wx >= wc ? style : "red" + + msg = """{$color}$(typeof(x)){/$color} {dim} ($hx, $wx){/dim} + {$style}content: ({$h_color}$hc{/$h_color}, {$w_color}$wc{/$w_color}){/$style}""" + print(io, apply_style(msg)) +end + +Base.print(io::IO, widget::AbstractWidget) = print_tree(print_node, print, io, widget) diff --git a/src/Live/app.jl b/src/Live/app.jl new file mode 100644 index 000000000..b572cb43e --- /dev/null +++ b/src/Live/app.jl @@ -0,0 +1,535 @@ +# ---------------------------------------------------------------------------- # +# APP INTERNALS # +# ---------------------------------------------------------------------------- # +""" +struct AppInternals + iob::IOBuffer + ioc::IOContext + term::AbstractTerminal + prevcontent::Union{Nothing, AbstractRenderable, String} + prevcontentlines::Vector{String} + raw_mode_enabled::Bool + last_update::Union{Nothing, Int} + refresh_Δt::Int + help_shown::Bool +end + +`AppInternals` handles "under the hood" work for live widgets. +It takes care of keeping track of information such as the content +displayed at the last refresh of the widget to inform the printing +of the widget's content at the next refresh. + +AppInternals also holds linked_widgets which can be used to link to +other widgets to access their internal variables. +""" +@with_repr mutable struct AppInternals + iob::IOBuffer + ioc::IOContext + term::AbstractTerminal + prevcontent::Union{Nothing,AbstractRenderable} + prevcontentlines::Vector{String} + raw_mode_enabled::Bool + last_update::Union{Nothing,Int} + refresh_Δt::Int + help_shown::Bool + help_message::Union{Nothing,String} + should_stop::Bool + + function AppInternals(; refresh_rate::Int = 60, help_message = nothing) + # get output buffers + iob = IOBuffer() + ioc = IOContext(iob, :displaysize => displaysize(stdout)) + + # prepare terminal + raw_mode_enabled = try + raw!(terminal, true) + true + catch err + @debug "Unable to enter raw mode: " exception = (err, catch_backtrace()) + false + end + + # hide the cursor + raw_mode_enabled && print(terminal.out_stream, "\x1b[?25l") + return new( + iob, + ioc, + terminal, + nothing, + String[], + raw_mode_enabled, + nothing, + (Int ∘ round)(1000 / refresh_rate), + false, + help_message, + false, + ) + end +end + +# ---------------------------------------------------------------------------- # +# APP # +# ---------------------------------------------------------------------------- # + +# ------------------------------- CONSTRUCTORS ------------------------------- # +""" +An `App` is a collection of widgets. + +!!! tip + Transition rules bind keys to "movement" in the app to change + focus to a different widget +""" +@with_repr mutable struct App <: AbstractWidgetContainer + internals::AppInternals + measure::Measure + controls::AbstractDict + parent::Union{Nothing,AbstractWidget} + compositor::Compositor + layout::Expr + width::Int + height::Int + expand::Bool + widgets::AbstractDict + transition_rules::AbstractDict + active::Symbol + on_draw::Union{Nothing,Function} + on_stop::Union{Nothing,Function} +end + +isactive(::App) = true + +""" +Execute a transition rule to switch focus to another widget. +""" +function execute_transition_rule(app::App, key)::Bool + haskey(app.transition_rules, key) || return false + rulesset = app.transition_rules[key] + haskey(rulesset, app.active) || return false + app.active = rulesset[app.active] + return true +end + +function quit(app::App) + app.internals.should_stop = true + return nothing +end + +app_controls = Dict( + 'q' => quit, + Esc() => quit, + 'h' => toggle_help, + :setactive => execute_transition_rule, +) + +""" + App( + widget::AbstractWidget; + controls::AbstractDict = app_controls, + width=1.0, + height=min(40, console_height()), + kwargs... + ) + +Convenience constructor for an `App` with a single widget. +""" +function App( + widget::AbstractWidget; + controls::AbstractDict = app_controls, + width = 1.0, + height = min(40, console_height()), + kwargs..., +) + layout = :(A($height, $width)) + return App( + layout; + widgets = Dict{Symbol,AbstractWidget}(:A => widget), + controls = controls, + height = height, + width = fint(width * console_width()), + kwargs..., + ) +end + +function App( + layout::Expr; + widgets::Union{Nothing,AbstractDict} = nothing, + transition_rules::Union{Nothing,AbstractDict} = nothing, + width = console_width(), + height = min(40, console_height()), + controls::AbstractDict = app_controls, + on_draw::Union{Nothing,Function} = nothing, + on_stop::Union{Nothing,Function} = nothing, + expand::Bool = true, + help_message::Union{Nothing,String} = nothing, +) + + # parse the layout expression and get the compositor + compositor = Compositor( + layout; + max_w = min(console_width(), width), + max_h = min(console_height(), height), + ) + measure = render(compositor).measure + + # if widgets are not provided, create empty widgets placeholders + widgets = if isnothing(widgets) + make_placeholders(compositor) + else + widgets + end + + # check that the layout and the widgets match + layout_keys = compositor.elements |> keys |> collect + widgets_keys = widgets |> keys |> collect + @assert issetequal(layout_keys, widgets_keys) "Mismatch between widget names and layout names: $layout_keys vs $widgets_keys" + + on_activated(widgets[first(widgets_keys)]) + + # enforce the size of each widget + widgets = enforce_app_size(compositor, widgets) + + transition_rules = + isnothing(transition_rules) ? infer_transition_rules(layout) : transition_rules + + msg_style = TERM_THEME[].emphasis + app = App( + AppInternals(; help_message = help_message), + measure, + controls, + nothing, + compositor, + layout, + width, + height, + expand, + widgets, + transition_rules, + widgets_keys[1], + on_draw, + on_stop, + ) + + set_as_parent(app) + return app +end + +""" + infer_transition_rules(layout::Expr)::Dict + +If no transition rules are passed, infer them from the layout's +spatial relationships. +""" +function infer_transition_rules(layout::Expr)::Dict + """ recursively get widgets in a layout elements """ + function get_elements(elem::Expr) + out = [] + for node in PreOrderDFS(elem) + node isa Expr || continue + node.args[1] ∉ (:*, :/) && push!(out, node.args[1]) + end + return out + end + get_elements(x) = nothing + + transition_rules = Dict( + ArrowRight() => Dict(), + ArrowLeft() => Dict(), + ArrowDown() => Dict(), + ArrowUp() => Dict(), + ) + + for node in PreOrderDFS(layout) + if node isa Expr + op = node.args[1] + op ∈ (:*, :/) || continue + source = get_elements(node.args[2]) + dest = get_elements(node.args[3]) + + # store commands to and from widgets + first_key, second_key = + op == :* ? (ArrowRight(), ArrowLeft()) : (ArrowDown(), ArrowUp()) + for w in source + transition_rules[first_key][w] = dest[1] + end + for w in dest + transition_rules[second_key][w] = source[1] + end + end + end + + return transition_rules +end + +""" +If no widget was passed, create placeholder widgets. +""" +function make_placeholders(compositor) + elements = compositor.elements + colors = if length(elements) > 1 + getfield.(Palette(blue, pink; N = length(elements)).colors, :string) + else + [pink] + end + + ws = Dict() + for (i, (name, elem)) in enumerate(pairs(elements)) + ws[name] = PlaceHolderWidget(elem.h, elem.w, string(name), colors[i]) + end + return ws +end + +""" + enforce_app_size(compositor::Compositor, widgets::AbstractDict) + +Called when an App is first created to set the size of all widgets. +""" +function enforce_app_size(compositor::Compositor, widgets::AbstractDict) + _keys = widgets |> keys |> collect + + for k in _keys + elem, wdg = compositor.elements[k], widgets[k] + wdg.internals.measure = Measure(elem.h, elem.w) + on_layout_change(wdg, wdg.internals.measure) + end + return widgets +end + +""" + enforce_app_size(app::App, measure::Measure) + +Called when a console is resized to adjust the apps layout. +""" +function enforce_app_size(app::App, measure::Measure) + compositor = Compositor(app.layout; max_w = measure.w, max_h = measure.h) + _keys = app.widgets |> keys |> collect + + for k in _keys + elem, wdg = compositor.elements[k], app.widgets[k] + wdg.internals.measure = Measure(elem.h, elem.w) + on_layout_change(wdg, wdg.internals.measure) + end + + app.compositor = compositor +end + +# ----------------------------------- frame ---------------------------------- # + +""" + on_layout_change(app::App) + +Called when the console is resized to adjust the apps layout. +""" +function on_layout_change(app::App) + new_width = app.expand ? console_width() : min(app.width, console_width()) + new_width == app.measure.w && return + + erase!(app) + clear(stdout) + + # the console is too small, re-design + app.measure = Measure(app.measure.h, new_width) + enforce_app_size(app, app.measure) +end + +""" + frame(app::App) + +Render the app and its content. +""" +function frame(app::App; kwargs...) + isnothing(app.on_draw) || app.on_draw(app) + + # adjust size to changes in console + on_layout_change(app) + + for (name, widget) in pairs(app.widgets) + # toggle active + if length(app.widgets) > 1 + app.active == name ? widget.internals.on_activated(widget) : + widget.internals.on_deactivated(widget) + end + + content = frame(widget) + + update!(app.compositor, name, content) + end + + # reset the activation state of each widget + for widget in values(app.widgets) + # wasactive, willbeactive = widget.internals.active, isactive(widget) + # !wasactive && willbeactive && widget.internals.on_activated(widget) + + widget.internals.active = isactive(widget) + end + + return render(app.compositor) +end + +""" + add_debugging_info!(content::AbstractRenderable, app::App)::AbstractRenderable + +Add debugging information to the top of the app. +""" +function add_debugging_info!(content::AbstractRenderable, app::App)::AbstractRenderable + # print the app's layout as a TREE + tree = sprint(print, app) + + debug_info = Panel(tree; width = content.measure.w) + return debug_info / content +end + +# ---------------------------------------------------------------------------- # +# RENDERING # +# ---------------------------------------------------------------------------- # + +""" + shouldupdate(app::App)::Bool + +Check if a widget's display should be updated based on: + 1. enough time elapsed since last update + 2. the widget has not beed displayed het +""" +function shouldupdate(app::App)::Bool + currtime = Dates.value(now()) + isnothing(app.internals.last_update) && begin + app.internals.last_update = currtime + return true + end + + Δt = currtime - app.internals.last_update + if Δt > app.internals.refresh_Δt + app.internals.last_update = currtime + return true + end + return false +end + +""" + replace_line(internals::AppInternals) + +Erase a line and move cursor +""" +function replace_line(internals::AppInternals) + erase_line(internals.ioc) + down(internals.ioc) +end + +""" + replace_line(internals::AppInternals, newline) + +Erase a line, write new content and move cursor. +""" +function replace_line(internals::AppInternals, newline) + erase_line(internals.ioc) + println(internals.ioc, newline) +end + +""" + refresh!(live::AbstractWidget)::Tuple{Bool, Any} + +Update the terminal display of a app. + +this is done by calling `frame` on the app to get the new content. +Then, line by line, the new content is compared to the previous one and when +a discrepancy occurs the lines gets re-written. +This is all done printing to a buffer first and then to `stdout` to avoid +jitter. +""" +function refresh!(app::App) + # check for keyboard inputs + retval = keyboard_input(app) + app.internals.should_stop && return something(retval, []) + + # check if its time to update + shouldupdate(app) || return nothing + + # get new content + internals = app.internals + content::AbstractRenderable = frame(app) + + LIVE_DEBUG[] == true && begin + content = add_debugging_info!(content, app) + end + + content_lines::Vector{String} = split(string(content), "\n") + nlines::Int = length(content_lines) + nlines_prev::Int = + isnothing(internals.prevcontentlines) ? 0 : length(internals.prevcontentlines) + old_lines = internals.prevcontentlines + nlines_prev == 0 && print(internals.ioc, "\n") + + # render new content + up(internals.ioc, nlines_prev) + for i in 1:nlines + line = content_lines[i] + + # avoid re-writing unchanged lines + !isnothing(internals.prevcontent) && + nlines_prev > i && + begin + old_line = old_lines[i] + line == old_line && begin + down(internals.ioc) + continue + end + end + + # re-write line + replace_line(internals, line) + end + + # output + internals.prevcontent = content + internals.prevcontentlines = content_lines + write(stdout, take!(internals.iob)) + return nothing +end + +""" + erase!(app::App) + +Erase a app from the terminal. +""" +function erase!(app::App) + isnothing(app.internals.prevcontent) && return + + nlines = app.internals.prevcontent.measure.h + up(app.internals.ioc, nlines) + cleartoend(app.internals.ioc) + write(stdout, take!(app.internals.iob)) + nothing +end + +""" + stop!(app::App) + +Restore normal terminal behavior. +""" +function stop!(app::App) + Base.stop_reading(stdin) + + internals = app.internals + print(internals.term.out_stream, "\x1b[?25h") # unhide cursor + print(stdout, "\x1b[?25h") + raw!(internals.term, false) + nothing +end + +""" + play(app::App; transient::Bool=true) + +Keep refreshing a renderable, until the user interrupts it. +""" +function play(app::App; transient::Bool = true) + Base.start_reading(stdin) + + retval = nothing + while isnothing(retval) + retval = refresh!(app) + end + stop!(app) + transient && erase!(app) + + retval = length(retval) > 0 ? retval[1] : retval + return retval +end diff --git a/src/Live/buttons.jl b/src/Live/buttons.jl new file mode 100644 index 000000000..c0c1f179b --- /dev/null +++ b/src/Live/buttons.jl @@ -0,0 +1,191 @@ +# ---------------------------------------------------------------------------- # +# AbstractButton # +# ---------------------------------------------------------------------------- # +abstract type AbstractButton <: AbstractWidget end + +""" +set the buttoon's state to :presed. +""" +function press_button(b::AbstractButton, ::Union{SpaceBar,Enter}) + if b.status == :not_pressed + b.lastpressed = Dates.value(now()) + b.status = :pressed + isnothing(b.callback) || return b.callback(b) + else + b.status = :not_pressed + end + return nothing +end + +button_controls = + Dict('q' => quit, Esc() => quit, Enter() => press_button, SpaceBar() => press_button) + +function on_layout_change(b::AbstractButton, m::Measure) + b.internals.measure = m +end + +""" + make_button_panel(message, color, text_color, pressed, active, w, h; kwargs...) + +Create a panel to display a button. +""" +function make_button_panel(message, color, text_color, pressed, active, w, h; kwargs...) + if pressed == :active + style = "$(text_color) on_$(color)" + background = color + else + style = active ? color : "dim $color" + background = "" + end + + return Panel( + "{$text_color on_$(background)}$message{/$text_color on_$(background)}", + style = style, + width = w, + height = h, + justify = get(kwargs, :justify, :center), + background = background, + kwargs..., + ) +end + +# ---------------------------------------------------------------------------- # +# Button # +# ---------------------------------------------------------------------------- # +# ------------------------------- constructors ------------------------------- # + +""" + Button + +A button widget. +It's display changes when pressed. +A callback can be set to be called when the button is pressed. +""" +@with_repr mutable struct Button <: AbstractButton + internals::WidgetInternals + controls::AbstractDict + message::String + status::Symbol + callback::Union{Nothing,Function} + lastpressed::Int + color::String + text_color::String + kwargs +end + +function Button( + message::String; + controls::AbstractDict = button_controls, + text_color = "bold white", + color = "red", + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, + kwargs..., +) + return Button( + WidgetInternals(Measure(), nothing, on_draw, on_activated, on_deactivated, false), + controls, + message, + :not_pressed, + nothing, + 0, + color, + text_color, + kwargs, + ) +end + +# ----------------------------------- frame ---------------------------------- # +function frame(b::Button; kwargs...) + isnothing(b.internals.on_draw) || b.internals.on_draw(b) + + status = if b.status == :pressed + currtime = Dates.value(now()) + + if currtime - b.lastpressed > 100 + b.status = :not_pressed + :inactive + else + :active + end + else + :inactive + end + + return make_button_panel( + b.message, + b.color, + b.text_color, + status, + isactive(b), + b.internals.measure.w, + b.internals.measure.h; + kwargs..., + ) +end + +# ---------------------------------------------------------------------------- # +# TOGGLE BUTTON # +# ---------------------------------------------------------------------------- # +# ------------------------------- constructors ------------------------------- # +""" +A button. Pressing it toggles its status between +activated and not. +""" +@with_repr mutable struct ToggleButton <: AbstractButton + internals::WidgetInternals + controls::AbstractDict + message::String + status::Symbol + callback::Union{Nothing,Function} + lastpressed::Int + color::String + text_color::String + kwargs +end + +function ToggleButton( + message::String; + controls::AbstractDict = button_controls, + text_color = "bold white", + color = "red", + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, + kwargs..., +) + return Button( + WidgetInternals(Measure(), nothing, on_draw, on_activated, on_deactivated, false), + controls, + message, + :not_pressed, + nothing, + 0, + color, + text_color, + kwargs, + ) +end + +# ----------------------------------- frame ---------------------------------- # +function frame(b::ToggleButton; kwargs...) + isnothing(b.internals.on_draw) || b.internals.on_draw(b) + + status = if b.status == :pressed + :active + else + :inactive + end + + return make_button_panel( + b.message, + b.color, + b.text_color, + status, + isactive(b), + b.internals.measure.w, + b.internals.measure.h; + kwargs..., + ) +end diff --git a/src/Live/gallery.jl b/src/Live/gallery.jl new file mode 100644 index 000000000..0910d9eff --- /dev/null +++ b/src/Live/gallery.jl @@ -0,0 +1,80 @@ +""" +A `Gallery` containes multiple widgets, but only shows one at the time. +""" +@with_repr mutable struct Gallery <: AbstractWidgetContainer + internals::WidgetInternals + controls::AbstractDict + widgets::Vector{AbstractWidget} + active::Int + show_panel::Bool + title::String +end + +gallery_controls = Dict( + ArrowRight() => activate_next_widget, + ArrowLeft() => activate_prev_widget, + 'q' => quit, + Esc() => quit, +) + +function Gallery( + widgets::Vector; + controls = gallery_controls, + height::Int = console_height() - 5, + width::Int = console_width(), + show_panel::Bool = true, + title::String = "Widget", + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, +) + # set widgets size + Δ = show_panel ? 4 : 0 + measure = Measure(height, width) + for wdg in widgets + on_layout_change(wdg, Measure(measure.h - Δ, measure.w - Δ)) + end + + gal = Gallery( + WidgetInternals(measure, nothing, on_draw, on_activated, on_deactivated, false), + controls, + widgets, + 1, + show_panel, + title, + ) + set_as_parent(gal) + return gal +end + +function on_layout_change(gal::Gallery, m::Measure) + gal.internals.measure = m + Δ = gal.show_panel ? 4 : 0 + for wdg in gal.widgets + on_layout_change(wdg, Measure(m.h - Δ, m.w - Δ)) + end +end + +# ----------------------------------- frame ---------------------------------- # +function frame(gal::Gallery; kwargs...) + isnothing(gal.internals.on_draw) || gal.internals.on_draw(gal) + + content = frame(get_active(gal)) + gal.show_panel || return content + + style = gal.show_panel && isactive(gal) ? "dim" : "hidden" + + Panel( + content; + title = gal.show_panel ? "$(gal.title) $(gal.active)/$(length(gal.widgets))" : + nothing, + justify = :center, + style = style, + title_style = "default", + title_justify = :center, + fit = false, + width = gal.internals.measure.w, + height = gal.internals.measure.h, + padding = (1, 1, 1, 1), + ) +end diff --git a/src/Live/help.jl b/src/Live/help.jl new file mode 100644 index 000000000..d22af5f57 --- /dev/null +++ b/src/Live/help.jl @@ -0,0 +1,88 @@ +""" +display/hide help tooltip +""" +function toggle_help(app, args...;) + internals = app.internals + width = app.measure.w + msg = + if !isnothing(internals.help_message) == true + parse_md(Markdown.parse(app.internals.help_message); width = width - 6) + else + "{dim} no help message shown{/dim}" + end |> RenderableText + + # get the docstring of the currently active widget + active_widget = app.widgets[app.active] + widget_msg = + something( + parse_md(getdocs(active_widget); width = max(20, width - 6)), + "{dim} no help message shown{/dim}", + ) |> RenderableText + + # get the docstring of each control method + col = TERM_THEME[].text_accent + all_controls = [pairs(active_widget.controls)..., pairs(app.controls)...] + already_added = [] + controls = [] + + for (k, c) in all_controls + (k ∈ already_added || k isa Symbol) && continue + + push!( + controls, + RenderableText( + "{bold $col} - $(k){/bold $col}: " * + parse_md(getdocs(c); width = max(20, width - 20)), + ), + ) + push!(already_added, k) + end + # create content + content = [ + msg, + "", + RenderableText( + md"#### Active widget: $(typeof(active_widget))"; + width = width - 10, + ), + "", + widget_msg, + "", + RenderableText(md"#### Controls"; width = width - 10), + controls..., + ] + + # create full message + help_message = Panel( + content; + width = width, + title = "Help", + title_style = "default bold blue", + title_justify = :center, + style = "dim", + ) + + # show/hide message + if internals.help_shown + # hide it + internals.help_shown = false + + # go to the top of the error message and delete everything + h = + console_height() - length(internals.prevcontentlines) - help_message.measure.h - + 1 + move_to_line(stdout, h) + cleartoend(stdout) + + # move cursor back to the top of the live to re-print it in the right position + move_to_line(stdout, console_height() - length(internals.prevcontentlines)) + else + # show it + erase!(app) + println(stdout, help_message) + internals.help_shown = true + end + + internals.prevcontent = nothing + internals.prevcontentlines = String[] +end diff --git a/src/Live/keyboard_input.jl b/src/Live/keyboard_input.jl new file mode 100644 index 000000000..e2b706306 --- /dev/null +++ b/src/Live/keyboard_input.jl @@ -0,0 +1,62 @@ + +""" + keyboard_input(widget::AbstractWidget) + +Get keyboard input from the terminal and execute the corresponding control function +if it exists. Returns a list of return values from the control functions. +""" +function keyboard_input(widget::AbstractWidget) + controls = widget.controls + if bytesavailable(terminal.in_stream) > 0 + # get input + c = readkey(terminal.in_stream) + c = haskey(KEYs, Int(c)) ? KEYs[Int(c)] : Char(c) + + # see if a control has been defined for this key + haskey(controls, c) && return controls[c](widget, c) + + # see if we can just pass any character + c isa Char && haskey(controls, Char) && return controls[Char](widget, c) + end + return [] +end + +""" + keyboard_input(widget::AbstractWidgetContainer) + +Get keyboard input from the terminal and execute the corresponding control function for active widgets. +""" +function keyboard_input(widget::AbstractWidgetContainer) + retvals = [] + if bytesavailable(terminal.in_stream) > 0 + # get input + c = readkey(terminal.in_stream) + c = haskey(KEYs, Int(c)) ? KEYs[Int(c)] : Char(c) # ::Union{Char, KeyInput} + + # execute command on each subwidget + for wdg in PreOrderDFS(widget) + retval = nothing + controls = wdg.controls + + # see if key is an app control key + haskey(controls, :setactive) && begin + control_exectued = controls[:setactive](wdg, c) + control_exectued && return retval + end + + # only apply to active widget(s) + isactive(wdg) || continue + + # see if a control has been defined for this key + haskey(controls, c) && (retval = controls[c](wdg, c)) + + # see if we can just pass any character + c isa Char && haskey(controls, Char) && (retval = controls[Char](wdg, c)) + + # if retval says so, stop looking at other widgets here + retval == :stop && break + isnothing(retval) || push!(retvals, retval) + end + end + return retvals +end diff --git a/src/Live/live.jl b/src/Live/live.jl new file mode 100644 index 000000000..c9ed7ccc8 --- /dev/null +++ b/src/Live/live.jl @@ -0,0 +1,96 @@ +module LiveWidgets +using REPL.TerminalMenus: readkey, terminal +using REPL.Terminals: raw!, AbstractTerminal +using Dates +import Base.Docs: doc as getdocs +using Markdown +using AbstractTrees +import MyterialColors: Palette, blue, pink + +import MyterialColors: pink + +import Term: default_width, reshape_text, TERM_THEME, fint, reshape_code_string, remove_ansi +import ..Renderables: AbstractRenderable, RenderableText +import ..Panels: Panel +import ..Measures: Measure +import ..Measures: width as get_width +import ..Measures: height as get_height +using ..Consoles +import ..Repr: @with_repr, termshow +import ..Style: apply_style +import ..Layout: Spacer, vLine, vstack, hLine, hstack, PlaceHolder +import ..Compositors: Compositor, render, update! +import ..Tprint: tprint +import ..TermMarkdown: parse_md + +export AbstractWidget, refresh!, play, key_press, shouldupdate, frame, stop! +export Pager +export SimpleMenu, ButtonsMenu, MultiSelectMenu +export InputBox, TextWidget, Button, ToggleButton +export Gallery +export App +export ArrowDown, + ArrowUp, + ArrowLeft, + ArrowRight, + DelKey, + HomeKey, + EndKey, + PageUpKey, + PageDownKey, + Enter, + SpaceBar, + Esc, + Del + +const LIVE_DEBUG = Ref(false) + +# ----------------------------- keyboard controls ---------------------------- # +abstract type KeyInput end + +struct ArrowLeft <: KeyInput end +struct ArrowRight <: KeyInput end +struct ArrowUp <: KeyInput end +struct ArrowDown <: KeyInput end +struct DelKey <: KeyInput end +struct HomeKey <: KeyInput end +struct EndKey <: KeyInput end +struct PageUpKey <: KeyInput end +struct PageDownKey <: KeyInput end +struct Enter <: KeyInput end +struct SpaceBar <: KeyInput end +struct Esc <: KeyInput end +struct Del <: KeyInput end + +KEYs = Dict{Int,KeyInput}( + 13 => Enter(), + 27 => Esc(), + 32 => SpaceBar(), + 127 => Del(), + 1000 => ArrowLeft(), + 1001 => ArrowRight(), + 1002 => ArrowUp(), + 1003 => ArrowDown(), + 1004 => DelKey(), + 1005 => HomeKey(), + 1006 => EndKey(), + 1007 => PageUpKey(), + 1008 => PageDownKey(), +) + +# ------------------------------- base widgets ------------------------------- # +include("abstract_widget.jl") +include("help.jl") +include("widgets.jl") +include("pager.jl") +include("buttons.jl") +include("menus.jl") + +# -------------------------------- containers -------------------------------- # +include("abstract_container.jl") +include("gallery.jl") +include("app.jl") + +include("keyboard_input.jl") + +end diff --git a/src/Live/menus.jl b/src/Live/menus.jl new file mode 100644 index 000000000..d5130d00f --- /dev/null +++ b/src/Live/menus.jl @@ -0,0 +1,385 @@ +# ---------------------------------------------------------------------------- # +# ABSTRACT MENU # +# ---------------------------------------------------------------------------- # +""" + AbstractMenu + +Objects of type AbstractMenu present the user with a few options +and let them select one by moving around with the up/down keys +and using Enter to select an option. +""" +abstract type AbstractMenu <: AbstractWidget end + +# --------------------------------- controls --------------------------------- # + +""" set next item to active """ +menu_activate_next(mn::AbstractMenu, ::Any) = mn.active = min(mn.active + 1, mn.n_titles) + +""" set previous item to active """ +menu_activate_prev(mn::AbstractMenu, ::Any) = mn.active = max(1, mn.active - 1) + +""" quit menu and return value""" +function menu_return_value(mn::AbstractMenu, ::Enter) + quit(mn) + return mn.active +end + +vert_menu_controls = Dict( + ArrowDown() => menu_activate_next, + ArrowUp() => menu_activate_prev, + Enter() => menu_return_value, + Esc() => quit, + 'q' => quit, +) + +hor_menu_controls = Dict( + ArrowRight() => menu_activate_next, + ArrowLeft() => menu_activate_prev, + Enter() => menu_return_value, + Esc() => quit, + 'q' => quit, +) + +function on_layout_change(mn::AbstractMenu, m::Measure) + mn.internals.measure = m +end + +# ---------------------------------------------------------------------------- # +# CONCRETE MENUS # +# ---------------------------------------------------------------------------- # +# -------------------------------- simple menu ------------------------------- # +""" +Simple text based menu. +The currently selected option is highlighted with a different style. +""" +@with_repr mutable struct SimpleMenu <: AbstractMenu + internals::WidgetInternals + controls::AbstractDict + titles::Vector{String} + n_titles::Int + active_style::String + inactive_style::String + active::Int + layout::Symbol + + function SimpleMenu( + titles::Vector; + controls::Union{Nothing,AbstractDict} = nothing, + width = default_width(), + active_style::String = "white bold", + inactive_style::String = "dim", + layout::Symbol = :vertical, + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, + ) + controls = something( + controls, + layout == :vertical ? vert_menu_controls : hor_menu_controls, + ) + + return new( + WidgetInternals( + Measure(length(titles), width), + nothing, + on_draw, + on_activated, + on_deactivated, + false, + ), + controls, + titles, + length(titles), + active_style, + inactive_style, + 1, + layout, + ) + end +end + +""" + active_title(mn::SimpleMenu, i::Int, width::Int) + +Return the title of the i-th item of the menu with the active style. +""" +function active_title(mn::SimpleMenu, i::Int, width::Int) + return RenderableText(mn.titles[i]; style = mn.active_style, width = width) |> string +end + +""" + inactive_title(mn::SimpleMenu, i::Int, width::Int) + +Return the title of the i-th item of the menu with the inactive style. +""" +function inactive_title(mn::SimpleMenu, i::Int, width::Int) + return RenderableText(mn.titles[i]; style = mn.inactive_style, width = width) |> string +end + +function frame(mn::SimpleMenu; kwargs...) + active_symbol = "❯" + titles = mn.titles + + # get size + m = mn.internals.measure + max_titles_width = + mn.layout == :vertical ? + min(m.w, maximum(get_width.(titles)) + textwidth(active_symbol) + 1) : m.w + + # make and stack title + titles = map( + i -> + i == mn.active ? active_title(mn, i, max_titles_width) : + inactive_title(mn, i, max_titles_width), + 1:length(titles), + ) + return if mn.layout == :vertical + vstack(titles...) + else + hstack(titles...) + end +end + +# ------------------------------- buttons menu ------------------------------- # +""" +Simple menu in which each option is a `Panel` object. +Styling reflects which option is currently selected +""" +@with_repr mutable struct ButtonsMenu <: AbstractMenu + internals::WidgetInternals + controls::AbstractDict + titles::Vector{String} + active_style::Vector + inactive_style::Vector + active_background::Vector + inactive_background::Vector + n_titles::Int + active::Int + layout::Symbol + panel_kwargs + + function ButtonsMenu( + titles::Vector; + controls::Union{Nothing,AbstractDict} = nothing, + width::Int = console_width(), + active_color::Union{Vector,String} = "black", + active_background::Union{Vector,String} = "white", + inactive_color::Union{Vector,String} = "dim", + inactive_background::Union{Vector,String} = "default", + layout::Symbol = :vertical, + height::Union{Nothing,Int} = length(titles), + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, + panel_kwargs..., + ) + controls = something( + controls, + layout == :vertical ? vert_menu_controls : hor_menu_controls, + ) + + # get parameters for each button + n = length(titles) + active_color = active_color isa String ? repeat([active_color], n) : active_color + active_background = + active_background isa String ? repeat([active_background], n) : + active_background + inactive_color = + inactive_color isa String ? repeat([inactive_color], n) : inactive_color + inactive_background = + inactive_background isa String ? repeat([inactive_background], n) : + inactive_background + @assert length(active_color) == n "Incorrect number of values for `active_color`" + @assert length(active_background) == n "Incorrect number of values for `active_background`" + @assert length(inactive_color) == n "Incorrect number of values for `inactive_color`" + @assert length(inactive_background) == n "Incorrect number of values for `inactive_background`" + + measure = if layout == :vertical + Measure(something(height, length(titles)), width) + else + hmax = layout == :vertical ? fint(height / n) : height + Measure(something(height, hmax), width) + end + + return new( + WidgetInternals(measure, nothing, on_draw, on_activated, on_deactivated, false), + controls, + titles, + active_color, + inactive_color, + active_background, + inactive_background, + length(titles), + 1, + layout, + panel_kwargs, + ) + end +end + +""" + active_title(mn::ButtonsMenu, i::Int, width::Int, height::Int; panel_kwargs...) + +Return the title of the i-th item of the menu with the active style. +""" +function active_title(mn::ButtonsMenu, i::Int, width::Int, height::Int; panel_kwargs...) + active_color, active_background = mn.active_style[i], mn.active_background[i] + return Panel( + "{$(active_color) on_$(active_background)}" * + mn.titles[i] * + "{/$(active_color) on_$(active_background)}"; + background = active_background, + style = "$(active_color) on_$(active_background)", + width = width, + justify = get(panel_kwargs, :justify, :center), + box = get(panel_kwargs, :box, :SQUARE), + height = height, + panel_kwargs..., + ) +end + +""" + inactive_title(mn::ButtonsMenu, i::Int, width::Int, height::Int; panel_kwargs...) + +Return the title of the i-th item of the menu with the inactive style. +""" +function inactive_title(mn::ButtonsMenu, i::Int, width::Int, height::Int; panel_kwargs...) + inactive_color, inactive_background = mn.inactive_style[i], mn.inactive_background[i] + return Panel( + "{$(inactive_color) on_$(inactive_background)}" * + mn.titles[i] * + "{/$(inactive_color) on_$(inactive_background)}"; + background = inactive_background, + style = inactive_color, + width = width, + justify = get(panel_kwargs, :justify, :center), + box = get(panel_kwargs, :box, :SQUARE), + height = height, + panel_kwargs..., + ) +end + +function frame(mn::ButtonsMenu; kwargs...) + m, n = mn.internals.measure, mn.n_titles + button_width = mn.layout == :vertical ? m.w : fint(m.w / n) + button_height = mn.layout == :vertical ? fint(m.h / n) : m.h + + # make and stack title + titles = map( + i -> + i == mn.active ? + active_title(mn, i, button_width, button_height; mn.panel_kwargs...) : + inactive_title(mn, i, button_width, button_height; mn.panel_kwargs...), + 1:(mn.n_titles), + ) + return if mn.layout == :vertical + vstack(titles...) + else + hstack(titles...) + end +end + +# ---------------------------------------------------------------------------- # +# MULTI SELECT # +# ---------------------------------------------------------------------------- # + +""" +Menu variant for selecting multiple options. +Color indicates current active option, ticks selected options +""" +@with_repr mutable struct MultiSelectMenu <: AbstractMenu + internals::WidgetInternals + controls::AbstractDict + options::Vector + active_style::String + inactive_style::String + options_width::Int + selected::Vector{Int} + active::Int + n_titles::Int + selected_sym::String + notselected_sym::String +end + +""" +quit and return selection. +""" +function menu_return_value(mn::MultiSelectMenu, ::Enter) + quit(mn) + return mn.selected +end + +""" +Toggle selection status of current active option +""" +function multi_select_toggle(mn::MultiSelectMenu, ::SpaceBar) + active = mn.active + if active ∈ mn.selected + deleteat!(mn.selected, mn.selected .== active) + else + push!(mn.selected, active) + end +end + +multi_select_controls = Dict( + ArrowDown() => menu_activate_next, + ArrowUp() => menu_activate_prev, + SpaceBar() => multi_select_toggle, + Enter() => menu_return_value, + Esc() => quit, + 'q' => quit, +) + +function MultiSelectMenu( + options::Vector; + controls::AbstractDict = multi_select_controls, + active_style::String = "white bold", + inactive_style::String = "dim", + width::Int = console_width(), + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, +) + selected_sym = apply_style("✔ ", active_style) + notselected_sym = apply_style("□ ", inactive_style) + + max_titles_width = min(width, maximum(get_width.(options)) + 2) + + MultiSelectMenu( + WidgetInternals( + Measure(length(options), width), + nothing, + on_draw, + on_activated, + on_deactivated, + false, + ), + controls, + options, + active_style, + inactive_style, + max_titles_width, + Int[], + 1, + length(options), + selected_sym, + notselected_sym, + ) +end + +function make_option(mn::MultiSelectMenu, i::Int, isactive::Bool, isselected::Bool) + sym = isselected ? mn.selected_sym : mn.notselected_sym + style = isactive ? mn.active_style : mn.inactive_style + + return RenderableText( + sym * "{$style}" * mn.options[i] * "{/$style}"; + width = mn.options_width, + ) +end + +function frame(mn::MultiSelectMenu; kwargs...) + isnothing(mn.internals.on_draw) || mn.internals.on_draw(mn) + + options = map(i -> make_option(mn, i, i == mn.active, i ∈ mn.selected), 1:(mn.n_titles)) + return vstack(options) +end diff --git a/src/Live/pager.jl b/src/Live/pager.jl new file mode 100644 index 000000000..6460dc28f --- /dev/null +++ b/src/Live/pager.jl @@ -0,0 +1,213 @@ +# ------------------------------- constructors ------------------------------- # +""" +A `Pager` is a widget for visualizing long texts a few lines at the time. +It shows a few lines of a longer text and allows users to move up and down the text +using keys such as arrow up and arrow down. +""" +@with_repr mutable struct Pager <: AbstractWidget + internals::WidgetInternals + controls::AbstractDict + text::AbstractString + content::Vector{String} + title::Union{Nothing,String} + line_numbers::Bool + tot_lines::Int + curr_line::Int + page_lines::Int +end + +# --------------------------------- controls --------------------------------- # +""" +move to the next line +""" +next_line(p::Pager, ::Union{Char,ArrowDown}) = + p.curr_line = min(p.tot_lines - p.page_lines, p.curr_line + 1) + +""" +move to the previous line +""" +prev_line(p::Pager, ::Union{Char,ArrowUp}) = p.curr_line = max(1, p.curr_line - 1) + +""" +move to the next page +""" +next_page(p::Pager, ::Union{PageDownKey,ArrowRight,Char}) = + p.curr_line = min(p.tot_lines - p.page_lines, p.curr_line + p.page_lines) + +""" +move to the previous page +""" +prev_page(p::Pager, ::Union{PageUpKey,ArrowLeft,Char}) = + p.curr_line = max(1, p.curr_line - p.page_lines) + +""" +move to first line +""" +home(p::Pager, ::HomeKey) = p.curr_line = 1 + +""" +move to the last line +""" +toend(p::Pager, ::EndKey) = p.curr_line = p.tot_lines - p.page_lines + +pager_controls = Dict( + ArrowRight() => next_page, + ']' => next_page, + ArrowLeft() => prev_page, + '[' => prev_page, + ArrowDown() => next_line, + '.' => next_line, + ArrowUp() => prev_line, + ',' => prev_line, + HomeKey() => home, + EndKey() => toend, + Esc() => quit, + 'q' => quit, +) + +""" + reshape_pager_content(content::AbstractString, line_numbers::Bool)::Vector{string} + +Turns a text into a vector of lines with the right size (and optionally line numbers) +""" +function reshape_pager_content( + content::AbstractString, + line_numbers::Bool, + width::Int, +)::Vector{String} + reshaped_content = if line_numbers == true + join( + map(iln -> "{dim}$(iln[1]) {/dim}" * iln[2], enumerate(split(content, "\n"))), + "\n", + ) + else + content + end + + reshaped_content = reshape_code_string(content, width - 6) + return split(string(RenderableText(reshaped_content; width = width - 6)), "\n") + # return split(reshaped_content, "\n") + +end + +function Pager( + text::String; + controls::AbstractDict = pager_controls, + height = 30, + width = console_width(), + title::Union{Nothing,String} = nothing, + line_numbers::Bool = false, + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, +) + content = reshape_pager_content(text, line_numbers, width) + return Pager( + WidgetInternals( + Measure(height, width), + nothing, + on_draw, + on_activated, + on_deactivated, + false, + ), + controls, + text, + content, + title, + line_numbers, + length(content), + 1, + max(height - 5, 1), + ) +end + +function on_layout_change(p::Pager, m::Measure) + p.page_lines = max(m.h - 5, 1) + p.content = reshape_pager_content(p.text, p.line_numbers, m.w) + p.tot_lines = length(p.content) + p.curr_line = min(p.curr_line, p.tot_lines - p.page_lines) + p.internals.measure = m +end + +# ---------------------------------- frame ---------------------------------- # + +""" + make_page_content(pager::Pager, i::Int, Δi::Int)::String + +Returns the content of the page as a string +""" +function make_page_content(pager, i, Δi) + if Δi >= pager.tot_lines + return join(pager.content, "\n") + else + return join(pager.content[i:min(pager.tot_lines, i + Δi)], "\n") + end +end + +""" + make_scrollbar(pager::Pager, i::Int, Δi::Int)::String + +Generate a scrollbar display to show progress in the pager's content. +""" +function make_scrollbar(pager, i, Δi) + page_lines = pager.page_lines + scrollbar_lines = min(pager.page_lines, 6) + scrollbar_lines_half = scrollbar_lines // 2 + scrollbar = vLine(scrollbar_lines; style = "white on_white") + + p = (i) / (pager.tot_lines - Δi) # progress in the file + scrollbar_center = p * (page_lines) |> round |> Int + nspaces_above = max(0, scrollbar_center - scrollbar_lines_half) |> round |> Int + nspaces_below = max(0, page_lines - scrollbar_lines - nspaces_above) |> round |> Int + + if nspaces_above == 0 + below = + RenderableText(join(repeat([" \n"], nspaces_below + 1)); style = "on_gray23") + return scrollbar / below + elseif nspaces_below == 0 + above = + RenderableText(join(repeat([" \n"], nspaces_above + 1)); style = "on_gray23") + return above / scrollbar + else + above = RenderableText(join(repeat([" \n"], nspaces_above)); style = "on_gray23") + below = RenderableText(join(repeat([" \n"], nspaces_below)); style = "on_gray23") + return above / scrollbar / below + end +end + +function make_page(pager, i, Δi) + page_content = make_page_content(pager, i, Δi) + scrollbar = make_scrollbar(pager, i, Δi) + return page_content * scrollbar +end + +""" + frame(pager::Pager)::AbstractRenderable + +Create a Panel with, as content, the currently visualized lines in the Pager. +""" +function frame(pager::Pager; omit_panel = false)::AbstractRenderable + isnothing(pager.internals.on_draw) || pager.internals.on_draw(pager) + + i, Δi = pager.curr_line, pager.page_lines + page = make_page(pager, i, Δi) + + style = isactive(pager) ? pink : "blue dim" + + # return content + omit_panel && return " " * RenderableText(page) + return Panel( + page, + fit = false, + width = pager.internals.measure.w, + height = pager.internals.measure.h, + padding = (2, 0, 1, 0), + subtitle = "Lines: $(max(1, i)):$(min(i+Δi, pager.tot_lines)) of $(pager.tot_lines)", + subtitle_style = "bold dim", + subtitle_justify = :right, + style = style, + title = pager.title, + title_style = "bold white", + ) +end diff --git a/src/Live/widgets.jl b/src/Live/widgets.jl new file mode 100644 index 000000000..128942739 --- /dev/null +++ b/src/Live/widgets.jl @@ -0,0 +1,235 @@ +""" +Collection of small widgets +""" + +# ---------------------------------------------------------------------------- # +# TEXT WIDGET # +# ---------------------------------------------------------------------------- # + +# ------------------------------- constructors ------------------------------- # +""" +TextWidget just shows a piece of text. +""" +@with_repr mutable struct TextWidget <: AbstractWidget + internals::WidgetInternals + controls::AbstractDict + text::String + as_panel::Bool + panel_kwargs +end + +text_widget_controls = Dict('q' => quit, Esc() => quit) + +TextWidget( + text::String; + as_panel = false, + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, + controls = text_widget_controls, + kwargs..., +) = TextWidget( + WidgetInternals( + Measure(Measure(text).h, console_width()), + nothing, + on_draw, + on_activated, + on_deactivated, + false, + ), + controls, + text, + as_panel, + Dict{Symbol,Any}(kwargs), +) + +on_layout_change(t::TextWidget, m::Measure) = t.internals.measure = m + +# ----------------------------------- frame ---------------------------------- # +function frame(tw::TextWidget; kwargs...) + isnothing(tw.internals.on_draw) || tw.internals.on_draw(tw) + measure = tw.internals.measure + + style = get(tw.panel_kwargs, :style, "default") + style = isactive(tw) ? "bold white " * style : style + + panel_kwargs = copy(tw.panel_kwargs) + if :style ∈ keys(tw.panel_kwargs) + panel_kwargs[:style] = panel_kwargs[:style] * (isactive(tw) ? " bold red" : " dim") + else + panel_kwargs[:style] = isactive(tw) ? " bold red" : "dim" + end + + tw.as_panel && return Panel( + tw.text; + width = measure.w, + height = measure.h, + fit = false, + panel_kwargs..., + ) + + txt = if !isactive(tw) + reshape_text(tw.text, measure.w - 4) + else + _txt = reshape_text(tw.text, measure.w - 6) + vLine(get_height(_txt)) * _txt |> string + end + + return RenderableText(txt; width = measure.w - 4) +end + +# ---------------------------------------------------------------------------- # +# INPUT BOX # +# ---------------------------------------------------------------------------- # + +# ------------------------------- constructors ------------------------------- # +""" +InputBox collects and displays user input as text. +""" +@with_repr mutable struct InputBox <: AbstractWidget + internals::WidgetInternals + controls::AbstractDict + input_text::Union{Nothing,String} + blinker_update::Int + blinker_status::Symbol + panel_kwargs::Dict{Symbol,Any} +end + +""" +new line +""" +newline(ib::InputBox, ::Enter) = isnothing(ib.input_text) || (ib.input_text *= "\n") + +""" insert space """ +addspace(ib::InputBox, ::SpaceBar) = isnothing(ib.input_text) || (ib.input_text *= " ") + +""" delete last character """ +del(ib::InputBox, ::Del) = + isnothing(ib.input_text) || begin + textwidth(ib.input_text) > 0 && (ib.input_text = ib.input_text[1:(end - 1)]) + end + +""" add character to input """ +addchar(ib::InputBox, c::Char) = + if isnothing(ib.input_text) + ib.input_text = string(c) + else + ib.input_text *= c + end + +input_box_controls = Dict( + Enter() => newline, + SpaceBar() => addspace, + Del() => del, + Esc() => quit, + Char => addchar, +) + +function InputBox(; + controls::AbstractDict = input_box_controls, + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, + kwargs..., +) + InputBox( + WidgetInternals( + Measure(5, console_width()), + nothing, + on_draw, + on_activated, + on_deactivated, + false, + ), + controls, + nothing, + 0, + :off, + kwargs, + ) +end + +on_layout_change(ib::InputBox, m::Measure) = ib.internals.measure = m + +# ----------------------------------- frame ---------------------------------- # +function frame(ib::InputBox; kwargs...) + isnothing(ib.internals.on_draw) || ib.internals.on_draw(ib) + + # create blinking symbol + currtime = Dates.value(now()) + if currtime - ib.blinker_update > 300 + ib.blinker_update = currtime + ib.blinker_status = ib.blinker_status == :on ? :off : :on + end + blinker = if isactive(ib) + ib.blinker_status == :on ? " " : "{on_white} {/on_white}" + else + "" + end + + panel_kwargs = copy(ib.panel_kwargs) + + panel_kwargs[:style] = get(ib.panel_kwargs, :style, "") * (isactive(ib) ? "" : " dim") + # get text to display + text = isnothing(ib.input_text) ? "{dim}start typing...{/dim}" : ib.input_text * blinker + measure = ib.internals.measure + return Panel(text; width = measure.w, height = measure.h, panel_kwargs...) +end + +# ---------------------------------------------------------------------------- # +# PLACEHOLDER # +# ---------------------------------------------------------------------------- # + +""" +Widget with no content to be used as a placeholder for choosing app layout. +""" +mutable struct PlaceHolderWidget <: AbstractWidget + internals::WidgetInternals + controls::AbstractDict + color::String + style::String + name::String +end + +on_layout_change(ph::PlaceHolderWidget, m::Measure) = ph.internals.measure = m + +function on_activated(ph::PlaceHolderWidget) + ph.internals.active = true + ph.style = "bold" +end +function on_deactivated(ph::PlaceHolderWidget) + ph.internals.active = false + ph.style = "dim" +end + +function PlaceHolderWidget( + h::Int, + w::Int, + name::String, + color::String; + on_draw::Union{Nothing,Function} = nothing, + on_activated::Function = on_activated, + on_deactivated::Function = on_deactivated, +) + internals = WidgetInternals( + Measure(h, w), + nothing, + on_draw, + on_activated, + on_deactivated, + false, + ) + + PlaceHolderWidget(internals, text_widget_controls, color, "dim", name) +end + +function frame(ph::PlaceHolderWidget; kwargs...) + isnothing(ph.internals.on_draw) || ph.internals.on_draw(ph) + m = ph.internals.measure + return PlaceHolder( + m.h, + m.w; + style = "$(ph.color) $(ph.style)", + text = "$(ph.name) ($(m.h), $(m.w)", + ) +end diff --git a/src/Term.jl b/src/Term.jl index f60f8efcd..4071e1169 100644 --- a/src/Term.jl +++ b/src/Term.jl @@ -18,6 +18,7 @@ less(term_demo) # see demo code # Example +``` julia ``` julia begin println(@green "this is green") @@ -39,11 +40,13 @@ const DEBUG_ON = Ref(false) const ACTIVE_CONSOLE_WIDTH = Ref{Union{Nothing,Int}}(nothing) const ACTIVE_CONSOLE_HEIGHT = Ref{Union{Nothing,Int}}(nothing) +const DEFAULT_CONSOLE_WIDTH = Ref{Int}(88) +const DEFAULT_STACKTRACE_WIDTH = Ref{Int}(140) default_width(io = stdout)::Int = - min(88, something(ACTIVE_CONSOLE_WIDTH[], displaysize(io)[2])) + min(DEFAULT_CONSOLE_WIDTH[], something(ACTIVE_CONSOLE_WIDTH[], displaysize(io)[2])) default_stacktrace_width(io = stderr)::Int = - min(140, something(ACTIVE_CONSOLE_WIDTH[], displaysize(io)[2])) + min(DEFAULT_STACKTRACE_WIDTH[], something(ACTIVE_CONSOLE_WIDTH[], displaysize(io)[2])) const DEFAULT_ASPECT_RATIO = Ref(4 / 3) # 4:3 - 16:9 - 21:9 @@ -81,8 +84,6 @@ include("link.jl") include("panels.jl") include("errors.jl") include("tprint.jl") -include("progress.jl") -include("logs.jl") include("trees.jl") include("dendograms.jl") include("tables.jl") @@ -90,7 +91,12 @@ include("markdown.jl") include("repr.jl") include("compositors.jl") include("grid.jl") + +# interactive +include("Live/live.jl") include("introspection.jl") +include("progress.jl") +include("logs.jl") include("prompt.jl") include("annotations.jl") @@ -106,6 +112,7 @@ export @with_repr, termshow, @showme export Compositor export grid export inspect +export Pager # ----------------------------------- base ----------------------------------- # using .Measures @@ -165,14 +172,10 @@ using .Logs: install_term_logger, uninstall_term_logger, TermLogger using .Tprint: tprint, tprintln -using .Progress: ProgressBar, ProgressJob, with, @track - using .Trees: Tree using .Dendograms: Dendogram -using .Introspection: inspect, typestree, expressiontree, inspect - using .Tables: Table using .Compositors: Compositor @@ -183,7 +186,16 @@ using .Repr: @with_repr, termshow, install_term_repr, @showme using .Grid +# -------------------------------- interactive ------------------------------- # +using .LiveWidgets + +# ----------------------------- using interactive ---------------------------- # +using .Progress: ProgressBar, ProgressJob, with, @track + +using .Introspection: inspect, typestree, expressiontree, inspect + using .Prompts include("__precompilation.jl") + end diff --git a/src/_compositor.jl b/src/_compositor.jl index 620376f2e..fb29cfdcf 100644 --- a/src/_compositor.jl +++ b/src/_compositor.jl @@ -48,9 +48,14 @@ function get_elements_and_sizes(ex::Expr; placeholder_size = nothing) min_h = min_w = typemax(Int) for e in elements e isa Symbol && continue - min_h = min(min_h, e.args[2]) - min_w = min(min_w, e.args[3]) + + h, w = e.args[2], e.args[3] + h = h isa Int ? h : fint(console_height() * h) + w = w isa Int ? w : fint(console_width() * w) + min_h = min(min_h, h) + min_w = min(min_w, w) end + # fallback size h, w = something(placeholder_size, default_size()) min_h == typemax(Int) && (min_h = h) @@ -89,12 +94,16 @@ function clean_layout_expr(ex::Expr) return ex end -compositor_placeholder(s, h, w, c) = PlaceHolder( - h, - w; - style = c, - text = "{bold underline bright_blue}$s{/bold underline bright_blue} {white}($h × $w){/white}", -) +compositor_placeholder(s, h, w, c) = begin + h = h isa Int ? h : fint(console_height() * h) + w = w isa Int ? w : fint(console_width() * w) + PlaceHolder( + h, + w; + style = c, + text = "{bold underline bright_blue}$s{/bold underline bright_blue} {white}($h × $w){/white}", + ) +end """ extract_renderable_from_kwargs(s, h, w; kwargs...) diff --git a/src/_errors.jl b/src/_errors.jl index a6990493e..8e2c8bbd6 100644 --- a/src/_errors.jl +++ b/src/_errors.jl @@ -60,7 +60,7 @@ function should_skip(frame::StackFrame, modul) mod = something(modul, frame) f = get_frame_file(frame) - bad = mod ∈ ["Base", "Main", nothing, "VSCodeServer", "REPL"] + bad = mod ∈ ["Base", nothing, "VSCodeServer", "REPL"] bad = bad || mod ∈ STACKTRACE_HIDDEN_MODULES[] return bad || ( diff --git a/src/_inspect.jl b/src/_inspect.jl index fb7bf4b73..d6dbcd466 100644 --- a/src/_inspect.jl +++ b/src/_inspect.jl @@ -1,4 +1,6 @@ import Base.Docs: doc as getdocs +using Base.Docs: meta, Binding +import Markdown """ get_docstring(obj) @@ -17,37 +19,35 @@ function get_docstring(obj) end """ - style_methods(methods::Union{Vector{Base.Method}, Base.MethodList}, tohighlight::AbstractString) + get_methods_with_docstrings(obj::Union{Union, DataType, Function}) -Create a `Renderable` with styled `Method` information for `inspect(::DataType)` +Get the docstring for each method for an object (function/datatype). """ -function style_methods( - methods::Union{Vector{Base.Method},Base.MethodList}, - tohighlight::AbstractString; - constructor::Bool = false, -) - txt_col = TERM_THEME[].text - fn_col = TERM_THEME[].func - highlight_col = TERM_THEME[].inspect_highlight - accent_col = TERM_THEME[].inspect_accent - mets = [] - prevmod = "" - for (i, m) in enumerate(methods) - code = " - " * split(string(m), " in ")[1] |> highlight_syntax - code = replace(code, string(m.name) => "{$fn_col}$(m.name){/$fn_col}") - - info = - string(m.module) != prevmod ? - RenderableText( - "{bright_blue} ────── Methods in {$accent_col underline bold}$(m.module){/$accent_col underline bold} for {$accent_col}$tohighlight{/$accent_col} ──────{/bright_blue}", - ) : nothing - prevmod = string(m.module) - - dest = RenderableText( - "\e[0m{dim default italic} → $(m.file):$(m.line){/dim default italic}", - ) - content = isnothing(info) ? code / dest / "" : info / code / dest / "" - push!(mets, content) +function get_methods_with_docstrings( + obj::Union{Union,DataType,Function}, +)::Tuple{Vector,Vector} + # get the parent module and the methods list for the object + mod = parentmodule(obj) + mm = methods(obj) + + # get the module's multidoc + binding = Binding(mod, Symbol(obj)) + dict = meta(mod) + multidoc = dict[binding] + + # for each module, attempt to get the docstring as markdown + docstrings = [] + for m in mm + # cleanup signature + sig = length(m.sig.types) == 1 ? Tuple{} : Tuple{m.sig.types[2:end]...} + + haskey(multidoc.docs, sig) || begin + push!(docstrings, nothing) + continue + end + docs = multidoc.docs[sig].text[1] |> Markdown.parse + push!(docstrings, docs) end - return mets + + return mm, docstrings end diff --git a/src/_repr.jl b/src/_repr.jl index 434e3f47e..925719dc6 100644 --- a/src/_repr.jl +++ b/src/_repr.jl @@ -2,8 +2,9 @@ import Term: default_width import OrderedCollections: OrderedDict function repr_get_obj_fields_display(obj) - field_names = fieldnames(typeof(obj)) theme = TERM_THEME[] + + field_names = fieldnames(typeof(obj)) length(field_names) == 0 && return RenderableText( "$obj{$(theme.repr_type)}::$(typeof(obj)){/$(theme.repr_type)}", ) @@ -24,10 +25,13 @@ function repr_get_obj_fields_display(obj) push!(values, RenderableText.(val; style = theme.repr_values)) end - line = vLine(length(fields); style = theme.repr_line) - space = Spacer(length(fields), 1) - - return rvstack(fields...) * line * space * lvstack(values...) + return Table( + OrderedDict(:field => fields, :value => values); + hpad = 0, + box = :NONE, + show_header = false, + compact = true, + ) end """ @@ -46,6 +50,9 @@ typename(typedef::Expr) = error("Could not parse type-head from: $typedef") end +""" +Create a Panel showing repr content using the current theme's style info. +""" repr_panel( obj, content, @@ -79,7 +86,14 @@ function vec_elems2renderables(v::Union{Tuple,AbstractVector}, N, max_w; ellipsi end function matrix2content(mtx::AbstractMatrix; max_w = 12, max_items = 50, max_D = 10) - max_D = console_width() < 150 ? 5 : max_D + max_D = if console_width() > 150 + max_D + elseif console_width() < 80 + 3 + else + 5 + end + N = min(max_items, size(mtx, 1)) D = min(max_D, size(mtx, 2)) @@ -98,7 +112,7 @@ function matrix2content(mtx::AbstractMatrix; max_w = 12, max_items = 50, max_D = headers = "(" .* string.(1:length(columns)) .* ")" |> collect end - # add a column of numbers + # add a column of row numbers if size(mtx, 1) <= max_items pushfirst!(columns, "{dim}(" .* string.(1:length(columns[1])) .* "){/dim}") else diff --git a/src/boxes.jl b/src/boxes.jl index e10cd3679..029bfe6f7 100644 --- a/src/boxes.jl +++ b/src/boxes.jl @@ -181,7 +181,7 @@ function get_title_row( # compose title line boxline = getfield(box, row) - open, close, space = "{" * style * "}", "{/" * style * "}", " " + open, close, space = "{" * style * "}", "{/" * style * "}\e[0m", " " topen, tclose = "\e[0m", open if !isnothing(title_style) @@ -222,10 +222,10 @@ function get_title_row( title * get_rrow(box, rw - tr, row) * close - return Segment("\e[0m" * line * "\e[0m") + return Segment(line) end end - return Segment("\e[0m" * line * "\e[0m") + return Segment(line) end """ diff --git a/src/compositors.jl b/src/compositors.jl index 8aafccb9d..73fd921cd 100644 --- a/src/compositors.jl +++ b/src/compositors.jl @@ -7,7 +7,8 @@ import ..Layout: PlaceHolder import ..Measures: width, height, default_size import ..Renderables: AbstractRenderable, RenderableText, Renderable import ..Repr: @with_repr, termshow -import Term: highlight, update! +import ..Consoles: console_height, console_width +import Term: highlight, update!, fint export Compositor @@ -33,6 +34,20 @@ each `LayoutElement` if there is one, the placeholder otherwise. w::Int renderable::Union{Nothing,String,AbstractRenderable} placeholder::PlaceHolder + + function LayoutElement( + id::Symbol, + h::Number, + w::Number, + renderable::Union{Nothing,String,AbstractRenderable}, + placeholder::PlaceHolder; + max_w::Int = console_width(), + max_h::Int = console_height(), + ) + h = h isa Int ? h : fint(max_h * h) + w = w isa Int ? w : fint(max_w * w) + return new(id, h, w, renderable, placeholder) + end end Base.size(e::LayoutElement) = (e.h, e.w) @@ -62,6 +77,8 @@ function Compositor( vpad::Int = 0, placeholder_size = nothing, check::Bool = true, + max_w::Int = console_width(), + max_h::Int = console_height(), kwargs..., ) elements = get_elements_and_sizes(layout; placeholder_size = placeholder_size) @@ -91,7 +108,9 @@ function Compositor( e.args[2], # height e.args[3], # width renderables[n], - placeholders[n], + placeholders[n]; + max_w = max_w, + max_h = max_h, ) for (n, e) in zip(names, elements) ) @@ -134,9 +153,14 @@ function update!( return end - # check that the shapes match + # if content is too small, pad it elem = compositor.elements[id] - if elem.w != width(content) || elem.h != height(content) + height(content) < elem.h && + (content = vertical_pad(content; height = elem.h, method = :top)) + width(content) < elem.w && (content = pad(content; width = elem.w, method = :right)) + + # check that the shapes match + if elem.w > width(content) || elem.h > height(content) content_shape = "{red}$(height(content)) × $(width(content)){/red}" target_shape = "{bright_blue}$(elem.h) × $(elem.w){/bright_blue}" @warn "Shape mismatch while updating compositor element {yellow}`$id`{/yellow}.\nGot $content_shape, expected $target_shape" @@ -164,7 +188,7 @@ Render a compositor's current layout. Get a renderable from each `LayoutElement` in the compositor and evaluate the layout expression interpolating the renderables. """ -function render(compositor::Compositor; show_placeholders = false) +function render(compositor::Compositor; show_placeholders = false)::AbstractRenderable # evaluate compositor elements = getfield.(values(compositor.elements), :id) renderables = getfield.(values(compositor.elements), :renderable) diff --git a/src/console.jl b/src/console.jl index 776916a84..a13f9be39 100644 --- a/src/console.jl +++ b/src/console.jl @@ -126,19 +126,22 @@ Get the current console width. """ console_width(io::IO = stdout) = something(ACTIVE_CONSOLE_WIDTH[], displaysize(io)[2]) -struct Console +mutable struct Console height width end Console(width) = Console(console_height(), width) +Console() = Console(console_height(), console_width()) +Base.displaysize(c::Console) = (c.height, c.width) function enable(console::Console) ACTIVE_CONSOLE_WIDTH[] = console.width - nothing + console end -function disable(::Console) +function disable(console::Console) ACTIVE_CONSOLE_WIDTH[] = nothing + console end end diff --git a/src/errors.jl b/src/errors.jl index 00bdd0be6..e7a220dd5 100644 --- a/src/errors.jl +++ b/src/errors.jl @@ -41,6 +41,8 @@ import ..Measures: height export install_term_stacktrace +const STACKTRACE_PRINTED_ERROR_MSG = Ref(false) + """ Stores information useful for creating the layout of a stack trace visualization. @@ -140,7 +142,8 @@ function install_term_stacktrace(; end # print message panel if VSCode is not handling that through a second call to this fn - (hasfield(typeof(io), :io) && isa(io.io, Base.TTY)) && begin + + if STACKTRACE_PRINTED_ERROR_MSG[] == false msg = highlight(sprint(Base.showerror, er)) |> apply_style err_panel = Panel( RenderableText( @@ -155,6 +158,9 @@ function install_term_stacktrace(; fit = false, ) print(io, err_panel) + STACKTRACE_PRINTED_ERROR_MSG[] = true + else + STACKTRACE_PRINTED_ERROR_MSG[] = false end catch cought_err # catch when something goes wrong during error handling in Term diff --git a/src/highlight.jl b/src/highlight.jl index b9599926b..bb24f771e 100644 --- a/src/highlight.jl +++ b/src/highlight.jl @@ -8,7 +8,7 @@ using Highlights.Format highlight_regexes = OrderedDict( :number => (r"(?(? - (r"(?(?(?![\:\<])[\+\-\*\%\^\&\|\!\=\>\<\~])"), + (r"(?(?(?![\:\<])[\+\-\*\%\^\&\|\!\=\>\<\~\[\]])"), :string => (r"(?[\'\"][\w\n]*[\'\"])",), :code => (r"(?([\`]{3}|[\`]{1})(\n|.)*?([\`]{3}|[\`]{1}))",), :expression => (r"(?\:\(+.+[\)])",), @@ -143,3 +143,18 @@ function load_code_and_highlight(path::AbstractString, lineno::Int; δ::Int = 3) return join(cleaned_lines, "\n") end + +""" + load_code_and_highlight(path::AbstractString)::String + +Load and highlight the syntax of an entire file +""" +function load_code_and_highlight(path::AbstractString)::String + lines = readlines(path) + code = [highlight_syntax(ln; style = true) for ln in lines] + + # clean + clean(line) = replace(line, " {/ }" => "") + codelines = clean.(code) + return join(codelines, "\n") +end diff --git a/src/introspection.jl b/src/introspection.jl index 49d10a157..85bbf7e43 100644 --- a/src/introspection.jl +++ b/src/introspection.jl @@ -2,7 +2,7 @@ module Introspection using InteractiveUtils import InteractiveUtils: supertypes as getsupertypes - +import OrderedCollections: OrderedDict import MyterialColors: pink, pink_light, orange, grey_dark, light_green import Term: @@ -15,15 +15,25 @@ import Term: expr2string, default_width, TERM_THEME, - highlight_syntax + highlight_syntax, + load_code_and_highlight, + str_trunc, + reshape_text import ..Renderables: RenderableText import ..Panels: Panel import ..Dendograms: Dendogram import ..Trees: Tree -import ..Layout: hLine +import ..Layout: hLine, vLine, Spacer, rvstack, lvstack import ..Tprint: tprintln import ..Repr: termshow +using ..LiveWidgets +import ..LiveWidgets: ArrowDown, ArrowUp, KeyInput +import ..TermMarkdown: parse_md +import ..Consoles: console_width, console_height +import ..Style: apply_style +import ..Compositors: Compositor +import ..Links: Link include("_inspect.jl") @@ -100,6 +110,39 @@ end # INTROSPECT DATATYPES # # ---------------------------------------------------------------------------- # +function style_methods( + methods::Union{Vector{Base.Method},Base.MethodList}, + docstrings::Vector, + width::Int, +) + mets = [] + fn_col = TERM_THEME[].func + panel_col = TERM_THEME[].text_accent + col = TERM_THEME[].inspect_highlight + + for (i, (m, docs)) in enumerate(zip(methods, docstrings)) + # method code + code = split(string(m), " in ")[1] |> highlight_syntax + code = reshape_text(apply_style(code), width; ignore_markup = true) + + # get docstring + docs = if !isnothing(docs) + docs = parse_md(something(docs, ""); width = width) + else + docs = "{green}No docstring found{/green}" + end + docs = hLine(width, "DocString"; style = "green") / docs / "" + + # method source + modul = "{default}Source: {bold $col}" * string(m.module) * "{/bold $col}{/default}" + source = "{dim}$(m.file):$(m.line){/dim}" + + out = code / "" / docs + push!(mets, out / hLine(width; style = "dim") / modul / source) + end + return mets +end + """ inspect(T::DataType; documentation::Bool=false, constructors::Bool=true, methods::Bool=true, supertypes::Bool=true) @@ -110,48 +153,89 @@ Flags can be used to choose the level of detail in the information presented: - methods: show methods using `T` in their signature - supertypes: show methods using `T`'s supertypes in their signature """ -function inspect( - T::Union{Union,DataType}; - documentation::Bool = true, - constructors::Bool = true, - methods::Bool = false, - supertypes::Bool = false, -) +function inspect(T::Union{Union,DataType};) + # get app size + layout = :(A(4, 1.0) / B(30, 1.0)) + comp = Compositor(layout) + widget_width = comp.elements[:B].w - 6 + + # get fields theme = TERM_THEME[] - hLine("inspecting: $T", style = theme.text_accent) |> print + field_names = apply_style.(string.(fieldnames(T)), theme.repr_accent) + field_types = apply_style.(map(f -> "::" * string(f), T.types), theme.repr_type) + + line = vLine(length(field_names); style = theme.repr_name) + space = Spacer(length(field_names), 1) + fields = rvstack(field_names...) * space * lvstack(string.(field_types)...) + type_name = apply_style(string(T), theme.repr_name * " bold") + + # get each method as a Pager + type_methods = style_methods(get_methods_with_docstrings(T)..., widget_width - 12) + methods_pagers = + map( + m -> Pager( + string(m[2]); + title = "Method $(m[1]) of $(length(type_methods))", + width = widget_width, + page_lines = comp.elements[:B].h - 8, + ), + enumerate(type_methods), + ) |> collect + + # create app + menu = ButtonsMenu( + ["Info", "Methods"]; + width = comp.elements[:A].w, + height = comp.elements[:A].h - 1, + layout = :horizontal, + ) - documentation || termshow(T; showdocs = false) - documentation && begin - termshow(T) - end - print("\n"^3) - - # types hierarchy - "{$(theme.text_accent)}○ Types hierarchy:" |> tprintln - " " * Tree(T) |> print - - # constructors - constructors && begin - "\n{$(theme.text_accent)}○ {$(theme.inspect_accent)}$T{/$(theme.inspect_accent)} constructors:" |> - tprintln - t_name = split(string(T), '.')[end] - print.(style_methods(Base.methods(T), t_name; constructor = true)) - end + # define widgets that go inside the top level Gallery + gallery_widgets = [ + Pager( # first widget is a pager with struct info + string( + Panel( + type_name / (" " * line * fields); + fit = false, + width = widget_width - 10, + justify = :center, + title = "Fields", + title_style = "bright_blue bold", + style = "bright_blue dim", + ) / hLine(widget_width - 10; style = "dim") / "" / Tree(T), + ); + width = comp.elements[:B].w - 1, + page_lines = comp.elements[:B].h - 7, + ), + Gallery( # inner gallery shows each method + methods_pagers; + width = comp.elements[:B].w - 1, + height = comp.elements[:B].h - 2, + show_panel = false, + ), + ] + + # make the app out of a menu and the top level gallery + widgets = OrderedDict( + :A => menu, + :B => Gallery( + gallery_widgets; + controls = Dict(), + width = comp.elements[:B].w, + height = comp.elements[:B].h - 1, + show_panel = false, + ), + ) - # methods with T and supertypes - methods && begin - for dt in getsupertypes(T)[1:(end - 1)] - _methods = methodswith(dt) - length(_methods) == 0 && continue - dt_name = split(string(dt), '.')[end] - - "\n{$(theme.text_accent)}○ Methods for {$(theme.inspect_accent)}$dt{/$(theme.inspect_accent)}:" |> - tprintln - print.(style_methods(_methods, dt_name)) - supertypes || break - end + transition_rules = Dict(ArrowDown() => Dict(:A => :B), ArrowUp() => Dict(:B => :A)) + + function cb(app) + app.widgets[:B].active = app.widgets[:A].active end - nothing + + app = App(layout, widgets, transition_rules; on_draw = cb) + play(app; transient = false) + return nothing end function inspect(F::Function; documentation::Bool = true) diff --git a/src/layout.jl b/src/layout.jl index a71235841..aea92257d 100644 --- a/src/layout.jl +++ b/src/layout.jl @@ -122,8 +122,6 @@ function pad(text::AbstractString, left::Int = 0, right::Int = 0; bg = nothing) end """ ---- - pad(s::Segment, left::Int = 0, right::Int = 0; kwargs...) Pad a segment. @@ -240,6 +238,8 @@ function vertical_pad(text::AbstractString, target_height::Int, method::Symbol) end end +# vertical_pad(text::AbstractString; height::Int, method::Symbol=:center) = vertical_pad(text, height, method) + """ vertical_pad(text::AbstractString, above::Int = 0, below::Int = 0) @@ -644,7 +644,12 @@ mutable struct vLine <: AbstractLayoutElement end """ - vLine(height::Number, style::Union{String, Nothing}; box::Symbol=:ROUNDED) + vLine( + height::Int; + style::String = TERM_THEME[].line, + box::Symbol = TERM_THEME[].box, + char::Union{Char,Nothing} = nothing, + ) Create a `vLine` given a height and, optionally, style information. """ @@ -707,21 +712,23 @@ function hLine( pad_txt::Bool = true, ) box = BOXES[box] - text = apply_style(text) * "\e[0m" + text = apply_style(text) * "{$style}" tl, tr = get_lr_widths(textlen(text)) lw, rw = get_lr_widths(width) _pad = pad_txt ? " " : get_lrow(box, 1, :top; with_left = false) line = + "{$style}" * get_lrow(box, lw - tl, :top; with_left = false) * _pad * text * _pad * "{$style}" * get_rrow(box, rw - tr, :top; with_right = false) * + "{/$style}{/$style}" * "\e[0m" - return hLine([Segment(line, style)], Measure(1, width)) + return hLine([Segment(line)], Measure(1, width)) end """ @@ -835,7 +842,7 @@ function PlaceHolder( ltrim_str(original, _w - _l) * "{default bold white}" * text * - "{/default bold white}" * + "{/default bold white}{$style}" * rtrim_str(original, _w + _l), ) end diff --git a/src/logs.jl b/src/logs.jl index 1ec43e716..4292711e5 100644 --- a/src/logs.jl +++ b/src/logs.jl @@ -15,7 +15,9 @@ import Term: rint, highlight, TERM_THEME, - str_trunc + str_trunc, + ltrim_str, + default_width import ..Consoles: console_width, console_height, change_scroll_region, move_to_line import ..Renderables: AbstractRenderable, RenderableText @@ -37,7 +39,7 @@ import ..Progress: SeparatorColumn, PercentageColumn import ..Measures: width, height -import ..Layout: hstack, rvstack, lvstack, vertical_pad, pad +import ..Layout: hstack, rvstack, lvstack, vertical_pad, pad, vLine export TermLogger, install_term_logger @@ -204,6 +206,7 @@ function Logging.handle_message( fname = ".{underline}$(frame.func){/underline}" end end + fname = split(fname, ".")[end] # prepare styles color = if lvl == Logging.Info @@ -225,37 +228,22 @@ function Logging.handle_message( msg = string(msg) msg = length(msg) > 1500 ? ltrim_str(msg, 1500 - 3) * "..." : msg - # prepare the first line of information + # prepare the first line: function name and log message fn_color = logger.theme.func firstline = "{$color underline bold}@$(string(lvl)){/$color underline bold} {$fn_color }($(_mod)$fname):{/$fn_color }" # print first line - msg_lines = split(msg, "\n") - length(msg_lines) > 0 && ( - firstline *= - " " * RenderableText( - reshape_text(msg_lines[1], console_width() - textlen(firstline) - 1); - style = logmsg_color, - ) + msg = RenderableText( + msg; + width = console_width() - textlen(firstline) - 1, + style = logmsg_color, ) - tprint(firstline; highlight = false) - - # for multi-lines message, print each line separately. - _vert = " $vert " - vert_width = textlen(_vert) - for n in 2:length(msg_lines) - # make sure the text fits in the given space - txt = RenderableText( - reshape_text(msg_lines[n], console_width() - vert_width - 1); - style = logmsg_color, - ) - v = join(repeat([_vert], height(txt)), "\n") - tprint(v * txt; highlight = false) - end + vline = " " * vLine(msg.measure.h; style = outline_markup) + tprint((firstline / vline) * " " * msg; highlight = false) # --------------------------------- contents --------------------------------- # # if no kwargs we can just quit - if length(kwargs) == 0 || length(msg_lines) == 0 + if length(kwargs) == 0 print_closing_line(color) return nothing end @@ -265,36 +253,35 @@ function Logging.handle_message( Optionally trim these strings to ensure formatting is fine. """ - # function to reshape all content appropriately - w = min(120, (Int ∘ round)((console_width() - 6) / 5) - 1) # six to allow space for vert and = - fmt_str(x, style; f = 1) = RenderableText(string(x); width = f * w - 1, style = style) - fmt_str(::Function, style; f = 1) = RenderableText("Function"; style = style) + # Create display of type,k->v for each kwarg + _types = map(t -> t isa Function ? Function : typeof(t), (collect(values(kwargs)))) + types_w = min(console_width() / 5, maximum(width.(string.(_types)))) |> round |> Int - # get types, keys and values as RenderableText with style - ks = map(k -> fmt_str(k, logger.theme.text_accent), keys(kwargs)) + _keys = map(k -> string(k), keys(kwargs)) + keys_w = min(console_width() / 5, maximum(width.(_keys))) |> round |> Int - _types = map(t -> t isa Function ? Function : typeof(t), (collect(values(kwargs)))) - _types = map(t -> fmt_str("$t::", "dim " * logger.theme.type), _types) + _vals = map(v -> highlight(string(v)), collect(values(kwargs))) + vals_w = min(console_width() / 5 * 3 - 7, maximum(width.(_vals)) - 7) |> round |> Int - vals = map(v -> style_log_msg_kw_value(logger, v), collect(values(kwargs))) - vals_style = [x[2] for x in vals] - vv = first.(vals) - vals = map(i -> fmt_str(vv[i], vals_style[i]; f = 3), 1:length(vv)) + # function to format content, style and shape + fmt_str(x, style::String, w::Int) = RenderableText(string(x); width = w, style = style) + fmt_str(::Function, style::String, w::Int) = + RenderableText("Function"; style = style, width = w) - # get the ma width of each piece of content - type_w = min(maximum(width.(_types)), w) - keys_w = min(maximum(width.(ks)), w) - vals_w = min(maximum(width.(vals)), 2w) + # get types, keys and values as RenderableText with style + ks = fmt_str.(_keys, logger.theme.text_accent, keys_w) + ts = fmt_str.(_types, "dim " * logger.theme.type, types_w) + vs = fmt_str.(_vals, "", vals_w) # print all kwargs eq = "{$(logger.theme.operator)}={/$(logger.theme.operator)}" tprintln(" $vert"; highlight = false) - for (t, k, v) in zip(_types, ks, vals, _types) + for (t, k, v) in zip(ts, ks, vs) # get the height of the tallest piece of content on this line h = maximum(height.([k, v, t])) # make sure all renderables have the same height and each columns' renderable has the right width - t = vertical_pad(pad(t; width = type_w, method = :left); height = h, method = :top) + t = vertical_pad(pad(t; width = types_w, method = :left); height = h, method = :top) k = vertical_pad(pad(k; width = keys_w, method = :left); height = h, method = :top) v = vertical_pad(pad(v; width = vals_w, method = :right); height = h, method = :top) diff --git a/src/markdown.jl b/src/markdown.jl index af0b3a2ce..b41a6d070 100644 --- a/src/markdown.jl +++ b/src/markdown.jl @@ -8,7 +8,6 @@ import UnicodeFun: to_latex import Term: reshape_text, highlight_syntax, - fillin, escape_brackets, default_width, TERM_THEME, diff --git a/src/measures.jl b/src/measures.jl index 4cc8c6550..da7660f99 100644 --- a/src/measures.jl +++ b/src/measures.jl @@ -1,7 +1,7 @@ module Measures import Term: rint, remove_ansi, remove_markup, default_width, DEFAULT_ASPECT_RATIO, textlen - +import Base: == export Measure """ @@ -14,6 +14,7 @@ mutable struct Measure w::Int end +Base.string(M::Measure) = "(h: $(M.h), w: $(M.w))" Base.show(io::IO, M::Measure) = print(io, "Measure (h: $(M.h), w: $(M.w))") """ @@ -35,12 +36,15 @@ function Measure(str::AbstractString) end Measure(::Nothing) = Measure(0, 0) +Measure() = Measure(0, 0) """ The sum of measures returns a measure with the highest value along each dimension. """ Base.:+(m1::Measure, m2::Measure)::Measure = Measure(m1.h + m2.h, max(m1.w, m2.w)) +==(m1::Measure, m2::Measure)::Bool = m1.h == m2.h && m1.w == m2.w + """ width diff --git a/src/panels.jl b/src/panels.jl index d57bb1114..e33072dc9 100644 --- a/src/panels.jl +++ b/src/panels.jl @@ -1,14 +1,7 @@ module Panels import Term: - join_lines, - fillin, - ltrim_str, - default_width, - remove_ansi, - get_bg_color, - textlen, - TERM_THEME + join_lines, ltrim_str, default_width, remove_ansi, get_bg_color, textlen, TERM_THEME import ..Renderables: AbstractRenderable, RenderablesUnion, Renderable, RenderableText import ..Layout: pad, vstack, Padding, lvstack @@ -56,6 +49,11 @@ mutable struct Panel <: AbstractPanel segments::Vector measure::Measure + """ + Panel(x1, x2; kwargs...) + + Catch construction with exactly two items passed + """ function Panel(x1, x2; kwargs...) # this is necessary to handle the special case in which 2 objs are passed # but they are not segments/measure @@ -70,7 +68,6 @@ end Base.size(p::Panel) = size(p.measure) """ ---- Panel(; fit::Bool = false, height::Int = 2, @@ -131,7 +128,6 @@ function Panel(; end """ ---- Panel( content::Union{AbstractString,AbstractRenderable}; fit::Bool = false, @@ -199,7 +195,6 @@ content_as_renderable( RenderableText(content, width = width - Δw, background = background, justify = justify) """ ---- Panel( content::Union{AbstractString,AbstractRenderable}, @@ -254,7 +249,6 @@ function Panel( end """ ---- Panel( content::Union{AbstractString,AbstractRenderable}, ::Val{false}, @@ -427,7 +421,7 @@ function render( ) # get left/right vertical lines - σ(s) = apply_style("\e[0m{" * style * "}" * s * "{/" * style * "}") + σ(s) = apply_style("{" * style * "}" * s * "{/" * style * "}") left, right = σ(box.mid.left), σ(box.mid.right) # get an empty padding line diff --git a/src/renderables.jl b/src/renderables.jl index 47085298d..0c495b486 100644 --- a/src/renderables.jl +++ b/src/renderables.jl @@ -4,7 +4,6 @@ import Term: split_lines, reshape_text, ltrim_str, - fillin, join_lines, unescape_brackets_with_space, DEBUG_ON, @@ -14,6 +13,8 @@ import Term: get_bg_color, textlen +import Term + import Term: highlight as highlighter import ..Consoles: console_width import ..Measures: Measure diff --git a/src/repr.jl b/src/repr.jl index 3695e650c..5b5168df2 100644 --- a/src/repr.jl +++ b/src/repr.jl @@ -17,7 +17,7 @@ import Term: remove_markup, reshape_code_string -import ..Layout: vLine, rvstack, lvstack, Spacer, vstack, cvstack, hLine, pad +import ..Layout: vLine, rvstack, lvstack, Spacer, vstack, cvstack, hLine, pad, hstack import ..Renderables: RenderableText, info, AbstractRenderable import ..Consoles: console_width import ..Panels: Panel, TextBox @@ -25,6 +25,7 @@ import ..Style: apply_style import ..Tprint: tprint, tprintln import ..Tables: Table import ..TermMarkdown: parse_md +import ..Measures: height export @with_repr, termshow, install_term_repr, @showme @@ -47,7 +48,7 @@ function termshow end --- termshow(io::IO, obj) -Generic method for any object not caught my dedicated methods. +Generic method for any object not caught by dedicated methods. Creates a `Panel` with the object's fields and contents. """ termshow(io::IO, obj) = print( @@ -111,7 +112,7 @@ function termshow(io::IO, obj::AbstractDict; kwargs...) theme = TERM_THEME[] # prepare text renderables - k = RenderableText.(short_string.(keys(obj)); style = theme.repr_accent * " bold") + _keys = RenderableText.(short_string.(keys(obj)); style = theme.repr_accent * " bold") ktypes = RenderableText.( map(k -> "{{" * short_string(typeof(k)) * "}}", collect(keys(obj))); @@ -124,32 +125,18 @@ function termshow(io::IO, obj::AbstractDict; kwargs...) style = theme.repr_type * " dim", ) - # trim if too many - arrows = if length(k) > 10 - k, ktypes, vals, vtypes = k[1:10], ktypes[1:10], vals[1:10], vtypes[1:10] - - push!(k, RenderableText("⋮"; style = theme.repr_accent)) - push!(ktypes, RenderableText("⋮"; style = theme.repr_type * " dim")) - push!(vals, RenderableText("⋮"; style = theme.repr_values)) - push!(vtypes, RenderableText("⋮"; style = theme.repr_type * " dim")) - - vstack(RenderableText.(fill("=>", length(k) - 1); style = TERM_THEME[].operator)...) - else - vstack(RenderableText.(fill("=>", length(k)); style = TERM_THEME[].operator)...) - end - - # prepare other renderables - space = Spacer(length(k), 1) - line = vLine(length(k); style = "dim $(TERM_THEME[].emphasis)") - - _keys_renderables = cvstack(ktypes...) * line * space * cvstack(k...) - _values_renderables = cvstack(vals...) * space * line * cvstack(vtypes...) + content = OrderedDict( + :type => ktypes, + :key => _keys, + :arrow => RenderableText.(fill("=>", length(_keys)); style = theme.operator), + :value => vals, + :vtype => vtypes, + ) - m = length(keys(obj)) return print( io, Panel( - _keys_renderables * space * arrows * space * _values_renderables; + Table(content; show_header = false, box = :NONE, hpad = 0, compact = true); fit = true, title = escape_brackets(string(typeof(obj))), title_justify = :left, @@ -158,7 +145,6 @@ function termshow(io::IO, obj::AbstractDict; kwargs...) style = theme.repr_panel, title_style = theme.repr_name, padding = (2, 2, 1, 1), - subtitle = "{$(TERM_THEME[].text_accent)}$m{/$(TERM_THEME[].text_accent)}{default} $(plural("item", m)){/default}", subtitle_justify = :right, ), ) diff --git a/src/segments.jl b/src/segments.jl index 357e3e3ba..4ebd71385 100644 --- a/src/segments.jl +++ b/src/segments.jl @@ -52,21 +52,6 @@ Base.show(io::IO, ::MIME"text/plain", seg::Segment) = # LAYOUT # # ---------------------------------------------------------------------------- # -""" - Term.fillin(segments::Vector{Segment})::Vector{Segment} - -Ensure that for each segment the text has the same width -""" -function Term.fillin(segments::Vector{Segment})::Vector{Segment} - w = maximum(width.(segments)) - - filled::Vector{Segment} = [] - for seg in segments - push!(filled, Segment(seg.text * " "^(w - seg.measure.w))) - end - return filled -end - # -------------------------------- concatenate ------------------------------- # """ concatenate strings and segments diff --git a/src/theme.jl b/src/theme.jl index fb9d4a930..de3b234f0 100644 --- a/src/theme.jl +++ b/src/theme.jl @@ -42,11 +42,15 @@ style outputs to terminal. logmsg::String = "#8abeff" # tree - tree_title::String = "$orange italic" - tree_node::String = "$yellow italic" - tree_leaf::String = yellow_light - tree_guide::String = blue - tree_max_width::Int = 44 + tree_mid::String = blue + tree_terminator::String = blue + tree_skip::String = blue + tree_dash::String = blue + tree_trunc::String = blue + tree_pair::String = red_light + tree_keys::String = yellow + tree_title::String = "bold " * orange + tree_max_leaf_width::Int = 44 # repr repr_accent::String = "bold #e0db79" @@ -92,7 +96,7 @@ style outputs to terminal. md_h6::String = "bold $cyan_lighter" md_latex::String = "$yellow_light italic" md_code::String = "$yellow_light italic" - md_codeblock_bg::String = "#262626" + md_codeblock_bg::String = "#202020" md_quote::String = "#5a74f2" md_footnote::String = "#9aacdb" md_table_header::String = "bold yellow" @@ -159,10 +163,14 @@ LightTheme = Theme( logmsg = "#8abeff", # tree - tree_title = "$orange italic", - tree_node = "$yellow_darker italic", - tree_leaf = yellow_dark, - tree_guide = blue_darker, + tree_mid = blue_darker, + tree_terminator = blue_darker, + tree_skip = blue_darker, + tree_dash = blue_darker, + tree_trunc = blue_darker, + tree_pair = red_light, + tree_keys = red_dark, + tree_max_leaf_width = 44, # repr repr_accent = "bold $yellow_darker", diff --git a/src/trees.jl b/src/trees.jl index fd4d41115..10a095079 100644 --- a/src/trees.jl +++ b/src/trees.jl @@ -1,22 +1,11 @@ module Trees -import OrderedCollections: OrderedDict -import Base: @kwdef +import AbstractTrees: print_tree, TreeCharSet, children using InteractiveUtils -import Term: - loop_last, - escape_brackets, - fillin, - highlight, - rint, - TERM_THEME, - textlen, - str_trunc, - expr2string - -import ..Renderables: AbstractRenderable -import ..Layout: vstack, pad, hLine +import Term: replace_multi, highlight, reshape_text, TERM_THEME, Theme + +import ..Renderables: AbstractRenderable, RenderableText import ..Style: apply_style import ..Segments: Segment import ..Measures: Measure @@ -29,292 +18,157 @@ export Tree # ---------------------------------------------------------------------------- # treeguides = Dict( - :standardtree => (" ", "│ ", "├── ", "└── "), - :boldtree => (" ", "┃ ", "┣━━ ", "┗━━ "), - :asciitree => (" ", "| ", "+-- ", "`-- "), + :standardtree => TreeCharSet("├", "└", "│", "─", "⋮", " ⇒ "), + :roundedtree => TreeCharSet("├──", "╰─", "│", "─", "⋮", " ⇒ "), + :boldtree => TreeCharSet("┣━━", "┗━━", "┃", "━", "⋮", " ⇒ "), + :asciitree => TreeCharSet("+--", "`--", "|", "--", "...", " => "), ) -""" - TreeGuides - -Store strings to make up a `Tree`'s guides (the line elements showing connections). -""" -struct TreeGuides - space::String - vline::String - branch::String - leaf::String -end - -""" - TreeGuides(guides_type::Symbol, style::String) - -Get tree guides with style information applied -""" -TreeGuides(guides_type::Symbol, style::String) = - TreeGuides(map((g) -> apply_style("{$style}$g{/$style}"), treeguides[guides_type])...) - # ---------------------------------------------------------------------------- # # TREE # # ---------------------------------------------------------------------------- # -# ----------------------------------- leaf ----------------------------------- # +const _TREE_PRINTING_TITLE = Ref{Union{Nothing,String}}(nothing) """ - asleaf + print_node(io, node) -Style an object to render it as a a string +Core function to enable fancy tree printing. Styles the leaf/key of each node. """ -function asleaf end +function print_node(io, node; kw...) + theme::Theme = TERM_THEME[] + + if isnothing(_TREE_PRINTING_TITLE[]) # print node + styled = if node isa AbstractString + highlight(node, :string; theme = theme) + else + styled = highlight(string(node); theme = theme) + end + reshaped = reshape_text(styled, theme.tree_max_leaf_width) + print(io, reshaped) + else # print title + title = _TREE_PRINTING_TITLE[] + print(io, apply_style(title, theme.tree_title)) + end -asleaf(x) = str_trunc(highlight(string(x)), TERM_THEME[].tree_max_width) -asleaf(x::Nothing) = nothing -asleaf(x::AbstractVector) = str_trunc(string(x), TERM_THEME[].tree_max_width) -asleaf(x::AbstractString) = str_trunc(highlight(x, :string), TERM_THEME[].tree_max_width) + _TREE_PRINTING_TITLE[] = nothing +end """ - Leaf + print_key(io, k; kw...) -End items in a `Tree`. No sub-trees. +Print a tree's node's key with some style. """ -struct Leaf - name::Union{Nothing,String} - text::Union{Nothing,String} - idx::Int # rendering index +function print_key(io, k; kw...) + s = TERM_THEME[].tree_keys + print(io, apply_style("{s}" * string(k) * "{/s}")) end -# ----------------------------------- tree ----------------------------------- # """ - Tree + style_guides(tree::String, guides::TreeCharSet, theme::Theme) -A tree is composed of nodes (other trees) and leaves (end items). -It renders as a hierarchical structure with lines (guides) connecting the various elements +Apply style to a tree's guides by inserting it into its string representation. +Not ideal as it will affect the style of other elements with the same characters +like Panels, but ok for no. """ -@kwdef struct Tree <: AbstractRenderable - segments::Union{Nothing,Vector{Segment}} = nothing - measure::Measure = Measure(segments) - - name::String - level::Int - nodes::Vector{Tree} - leaves::Vector{Leaf} - idx::Int = 0 # rendering index for tree that are nodes in a lager tree - - title_style::String = TERM_THEME[].tree_title - node_style::String = TERM_THEME[].tree_node - leaf_style::String = TERM_THEME[].tree_leaf - guides_style::String = TERM_THEME[].tree_guide - guides_type::Symbol = :standardtree +function style_guides(tree::String, guides::TreeCharSet, theme::Theme) + return replace_multi( + tree, + guides.mid => apply_style(guides.mid, theme.tree_mid), + guides.terminator => apply_style(guides.terminator, theme.tree_terminator), + guides.skip => apply_style(guides.skip, theme.tree_skip), + guides.dash => apply_style(guides.dash, theme.tree_dash), + guides.trunc => apply_style(guides.trunc, theme.tree_trunc), + strip(guides.pair) => apply_style(string(strip(guides.pair)), theme.tree_pair), + ) end """ -Show/render a `Tree` + Tree + +Renderable tree. """ -function Base.show(io::IO, tree::Tree) - if io != stdout - print( - io, - "Tree: $(length(tree.nodes)) nodes, $(length(tree.leaves)) leaves | Idx: $(tree.idx)", - ) - else - println.(io, tree.segments) - end +struct Tree <: AbstractRenderable + segments::Vector{Segment} + measure::Measure end """ -Add a new node to an existing tree's nodes or levaes. -""" -function addnode!(nodes::Vector{Tree}, leaves::Vector{Leaf}, level, k, v::AbstractDict) - return push!( - nodes, - Tree( - v; - level = level + 1, - title = str_trunc(string(k), TERM_THEME[].tree_max_width), - idx = length(nodes) + length(leaves) + 1, - ), + Tree( + tree; + guides::Union{TreeCharSet,Symbol} = :standardtree, + theme::Theme = TERM_THEME[], + printkeys::Union{Nothing,Bool} = true, + print_node_function::Function = print_node, + print_key_function::Function = print_key, + title::Union{String, Nothing}=nothing, + prefix::String = " ", + kwargs..., ) -end -function addnode!(nodes::Vector{Tree}, leaves::Vector{Leaf}, level, k, v::Pair) - k = if isnothing(v.first) - nothing - else - str_trunc(string(v.first), TERM_THEME[].tree_max_width) - end - idx = length(nodes) + length(leaves) + 1 - return push!(leaves, Leaf(k, asleaf(v.second), idx)) -end +Constructor for `Tree` -function addnode!(nodes::Vector{Tree}, leaves::Vector{Leaf}, level, k, v::Any) - k = isnothing(k) ? nothing : str_trunc(string(k), TERM_THEME[].tree_max_width) - idx = length(nodes) + length(leaves) + 1 - return push!(leaves, Leaf(k, asleaf(v), idx)) -end +It uses `AbstractTrees.print_tree` to get a string representation of `tree` (any object +compatible with the `AbstractTrees` packge). Applies style to the string and creates a +renderable `Tree`. -function addnode!(nodes::Vector{Tree}, leaves::Vector{Leaf}, level, k, v::Vector) - for _v in v - _k = - _v isa Union{Dict,OrderedDict} ? collect(keys(_v))[1] : - (v isa Pair ? _v.first : v) - addnode!(nodes, leaves, level + 1, _k, _v) - end -end +Arguments: +- `tree`: anything compatible with `AbstractTree` +- `guides`: if a symbol, the name of preset tree guides types. Otherwise an instance of + `AbstractTrees.TreeCharSet` +- `theme`: `Theme` used to set tree style. +- `printkeys`: If `true` print keys. If `false` don't print keys. +- `print_node_function`: Function used to print nodes. +- `print_key_function`: Function used to print keys. +- `title`: Title of the tree. +- `prefix`: Prefix to be used in `AbstractTrees.print_tree` -""" - Tree(data::Union{AbstractDict, Pair}; level=0, title::String="tree", kwargs...) -Construct a `Tree` out of a `Dict` or `OrderedDict`. Recursively handle nested `Dict`s. +For other kwargs look at `AbstractTrees.print_tree` """ function Tree( - data::Union{AbstractDict,Pair,Vector}; - level = 0, - title::String = "tree", + tree; + guides::Union{TreeCharSet,Symbol} = :standardtree, + theme::Theme = TERM_THEME[], + printkeys::Union{Nothing,Bool} = true, + print_node_function::Function = print_node, + print_key_function::Function = print_key, + title::Union{String,Nothing} = nothing, + prefix::String = " ", kwargs..., ) - - # initialize - nodes::Vector{Tree} = [] - leaves::Vector{Leaf} = [] - - # go over all entries - for (k, v) in zip(keys(data), values(data)) - addnode!(nodes, leaves, level, k, v) - end - - # if we're handling the first tree, render it. Otherwise parse nested trees. - if level > 0 - # we don't need to render - return Tree(; - name = title, - level = level, - nodes = nodes, - leaves = leaves, - kwargs..., - ) - else - # render and get measure - segments = render( - Tree(; name = title, level = level, nodes = nodes, leaves = leaves, kwargs...), - ) - measure = Measure(segments) - - return Tree(; - segments = segments, - measure = measure, - name = str_trunc(title, TERM_THEME[].tree_max_width), - level = level, - nodes = nodes, - leaves = leaves, + _TREE_PRINTING_TITLE[] = title + + # print tree + guides = guides isa Symbol ? treeguides[guides] : guides + tree = sprint( + io -> print_tree( + print_node_function, + print_key_function, + io, + tree; + charset = guides, + printkeys = printkeys, + prefix = prefix, kwargs..., - ) - end -end - -# ---------------------------------- render ---------------------------------- # - -""" - render(tree::Tree)::Vector{Segment} - -Render a `Tree` into segments. Recursively handle nested trees. - - -""" -function render( - tree::Tree; - prevguides::String = "", - lasttree = false, - waslast = [], - guides = nothing, -)::Vector{Segment} - guides = isnothing(guides) ? TreeGuides(tree.guides_type, tree.guides_style) : guides - hasleaves = length(tree.leaves) > 0 - - segments::Vector{Segment} = [] - - """ - Add a segment to the segments vector - """ - _add(x::String, style) = push!(segments, Segment(x, style)) - _add(x::String) = _add(x, "default") - - # ------------------------------ render in parts ----------------------------- # - # render initial part - if tree.level == 0 - header_text = "{$(tree.title_style)}$(tree.name){/$(tree.title_style)}" - header = - (" " * header_text * " ") / - hLine(textlen(tree.name) + 2; style = "$(tree.title_style) dim", box = :HEAVY) - - append!(segments, header.segments) - else - _pre_guides = "" - for (n, (l, last)) in enumerate(loop_last(waslast)) - # ugly, get the correct sequence of guides based on where we are/what came before - if last - _end = lasttree ? guides.leaf : guides.branch - _pre_guides *= l ? _end : guides.space + ), + ) - else - _end = n == length(waslast) ? guides.branch : guides.vline - _pre_guides *= lasttree ? (l ? guides.leaf : guides.vline) : _end - end - end + # style keys + rx = Regex("(?<=$(guides.dash)) [\\w.,\":\\[\\]\\d]+ (?=$(strip(guides.pair)))") + tree = replace( + tree, + rx => SubstitutionString( + "{$(theme.tree_keys)}" * s"\g<0>" * "{/$(theme.tree_keys)}", + ), + ) - _add(_pre_guides * "{$(tree.node_style)}$(tree.name){/$(tree.node_style)}") - end - tree.level == 0 && _add(prevguides * guides.vline) - - # get all nodes and sub-trees in order for rendering - elements = vcat(tree.nodes, tree.leaves) - idxs = getfield.(elements, :idx) - elements = elements[sortperm(idxs)] - # @info "rendering $(length(elements)) elements" elements - - for (last, elem) in loop_last(elements) - if elem isa Tree - prev = prevguides * (last ? guides.space : guides.vline) - - append!( - segments, - render( - elem; - prevguides = prev, - lasttree = last, - waslast = vcat(waslast, last), # vcat(waslast, lasttree), - guides = guides, - ), - ) - # hasleaves && length(elem.leaves) > 0 && _add(prevguides * guides.vline) - elseif elem isa Leaf - # @info "rendering leaf $(elem.idx): $(elem.name) > $(elem.text)" - seg = last ? guides.leaf : guides.branch - if isnothing(elem.text) - k = isnothing(elem.name) ? "" : highlight(elem.name) - v = "" - else - k = if isnothing(elem.name) - "" - else - "{$(tree.leaf_style)}$(elem.name){/$(tree.leaf_style)}: " - end - v = elem.text - end - _add(prevguides * seg * k * v) - end - end + # style guides + tree = style_guides(tree, guides, theme) - # left pad segments - if tree.level == 0 - header_length = length(header.segments) - padded_segments = vcat( - header.segments..., - pad(segments[(header_length + 1):end], rint(header.measure.w / 2 - 1))..., - ) - return fillin(padded_segments) - else - return segments - end + # turn into a renderable + rt = RenderableText(tree) + return Tree(rt.segments, rt.measure) end # ---------------------------------------------------------------------------- # @@ -365,38 +219,27 @@ end Tree(T::DataType)::Tree Construct a `Tree` visualization of `T`'s types hierarchy +The key is in costructing the actual hierarchy tree recursively. """ function Tree(T::DataType)::Tree - theme = TERM_THEME[] # create a dictionary of types hierarchy subs = Dict(string(s) => nothing for s in subtypes(T)) data = make_hierarchy_dict(supertypes(T), T, subs) - return Tree( - data; - title = string(supertypes(T)[end - 1]), - # title = "Any", - title_style = "$(theme.emphasis_light) italic", - guides_style = theme.emphasis, - ) -end + # define a fn to avoid printing nodes + s = TERM_THEME[].tree_mid + fn(io::IO, x) = + length(children(x)) > 0 ? print(io, apply_style("{$s}┬{/$s}")) : print(io, "") -function _key(e::Expr) - if length(e.args) > 1 - "$(expr2string(e)) {dim $(TERM_THEME[].emphasis)}($(e.head): {/dim $(TERM_THEME[].emphasis)}{red bold default}$(e.args[1]){/red bold default}{dim blue}){/dim blue}" - else - string(e.head) - end -end -_values(e::Expr) = length(e.args) > 1 ? e.args[2:end] : e.args + # change style of pair + _style = TERM_THEME[].tree_pair + TERM_THEME[].tree_pair = "hidden" -_pair(x) = nothing => x -_pair(e::Expr) = Dict(_key(e) => _pair.(_values(e))) + # print tree + _tree = Tree(data; printkeys = true, print_node_function = fn) + TERM_THEME[].tree_pair = _style -function Tree(expr::Expr; kwargs...) - parsed = _pair(expr) - parsed = Dict(collect(keys(parsed))[1] => parsed) - return Tree(parsed; title = expr2string(expr)) + return _tree end end diff --git a/test/06_test_box.jl b/test/06_test_box.jl index 7b8d45050..69ec0798a 100644 --- a/test/06_test_box.jl +++ b/test/06_test_box.jl @@ -48,7 +48,7 @@ import Term: Segment ) @test left.measure.w == 22 @test left.text == - "\e[0m\e[31m╭──── \e[34mtest\e[39m\e[31m\e[31m ──────────╮\e[39m\e[0m\e[39m" + "\e[31m╭──── \e[34mtest\e[39m\e[31m\e[31m ──────────╮\e[39m\e[0m\e[39m" right = get_title_row( :top, @@ -61,7 +61,7 @@ import Term: Segment ) @test right.measure.w == 22 @test right.text == - "\e[0m\e[31m╭─────────── \e[34mtest\e[39m\e[31m\e[31m ───╮\e[39m\e[0m\e[39m" + "\e[31m╭─────────── \e[34mtest\e[39m\e[31m\e[31m ───╮\e[39m\e[0m\e[39m" center = get_title_row( :top, @@ -74,7 +74,7 @@ import Term: Segment ) @test center.measure.w == 22 @test center.text == - "\e[0m\e[31m╭─────── \e[34mtest\e[39m\e[31m\e[31m ───────╮\e[39m\e[0m\e[39m" + "\e[31m╭─────── \e[34mtest\e[39m\e[31m\e[31m ───────╮\e[39m\e[0m\e[39m" for width in (15, 21, 33, 58), justify in (:left, :center, :right) line = get_title_row( diff --git a/test/08_test_panel.jl b/test/08_test_panel.jl index 8ff8e816b..c097c649f 100644 --- a/test/08_test_panel.jl +++ b/test/08_test_panel.jl @@ -245,7 +245,7 @@ id est laborum.""", oooo """ p = Panel(circle; fit = true, padding = (2, 2, 0, 0)) @test string(p) == - "\e[0m\e[22m╭────────────────╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m oooo \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m oooooooooo \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m oooooooooooo \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m oooooooooooo \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m oooooooooo \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m oooo \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰────────────────╯\e[22m\e[0m\e[0m" + "\e[0m\e[22m╭────────────────╮\e[22m\e[0m\n\e[22m│\e[22m oooo \e[22m│\e[22m\n\e[22m│\e[22m oooooooooo \e[22m│\e[22m\n\e[22m│\e[22m oooooooooooo \e[22m│\e[22m\n\e[22m│\e[22m oooooooooooo \e[22m│\e[22m\n\e[22m│\e[22m oooooooooo \e[22m│\e[22m\n\e[22m│\e[22m oooo \e[22m│\e[22m\n\e[0m\e[22m╰────────────────╯\e[22m\e[0m\e[0m" p = Panel( "test"^25; @@ -332,7 +332,7 @@ ads ); background = "on_red", fit = true) @test string(p) == - "\e[0m\e[22m╭──────────────────────╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44m asasd\e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44masdasadas\e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44masdsasdasdsadasdsa\e[49m\e[49m\e[41m \e[49m\e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44mads\e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44m \e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[0m\e[22m│\e[22m\n\e[0m\e[22m╰──────────────────────╯\e[22m\e[0m\e[0m" + "\e[0m\e[22m╭──────────────────────╮\e[22m\e[0m\n\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44m asasd\e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[22m│\e[22m\n\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44masdasadas\e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[22m│\e[22m\n\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44masdsasdasdsadasdsa\e[49m\e[49m\e[41m \e[49m\e[22m│\e[22m\n\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44mads\e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[22m│\e[22m\n\e[22m│\e[22m\e[41m \e[49m\e[41m\e[44m \e[49m\e[41m \e[49m\e[49m\e[41m \e[49m\e[22m│\e[22m\n\e[0m\e[22m╰──────────────────────╯\e[22m\e[0m\e[0m" end @testset "\e[34mPANEL - UnicodePlots" begin diff --git a/test/09_test_layout.jl b/test/09_test_layout.jl index f89c0f2c6..6a3f44454 100644 --- a/test/09_test_layout.jl +++ b/test/09_test_layout.jl @@ -50,7 +50,7 @@ end p = Panel(height = 10, width = 20) @test string(vertical_pad(p, 4, 4)) == - " \n \n \n \n\e[0m\e[22m╭──────────────────╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰──────────────────╯\e[22m\e[0m\e[0m\n \n \n \n " + " \n \n \n \n\e[0m\e[22m╭──────────────────╮\e[22m\e[0m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[0m\e[22m╰──────────────────╯\e[22m\e[0m\e[0m\n \n \n \n " vertical_pad!(p, 4, 4) @test p isa Panel @@ -63,11 +63,11 @@ end p = Panel(height = 2, width = 4) @test string(vertical_pad(p; height = 5, method = :top)) == - "\e[0m\e[22m╭──╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰──╯\e[22m\e[0m\e[0m\n \n " + "\e[0m\e[22m╭──╮\e[22m\e[0m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[0m\e[22m╰──╯\e[22m\e[0m\e[0m\n \n " @test string(vertical_pad(p; height = 5, method = :bottom)) == - " \n \n\e[0m\e[22m╭──╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰──╯\e[22m\e[0m\e[0m" + " \n \n\e[0m\e[22m╭──╮\e[22m\e[0m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[0m\e[22m╰──╯\e[22m\e[0m\e[0m" @test string(vertical_pad(p; height = 5, method = :center)) == - " \n\e[0m\e[22m╭──╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰──╯\e[22m\e[0m\e[0m\n " + " \n\e[0m\e[22m╭──╮\e[22m\e[0m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[0m\e[22m╰──╯\e[22m\e[0m\e[0m\n " end @testset "\e[34mlayout - spacer" begin @@ -110,7 +110,7 @@ end @test pp isa Renderable @test pp.measure.w == 15 @test string(pp) == - "\e[0m\e[22m╭───╮\e[22m\e[0m \n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m \n\e[0m\e[22m╰───╯\e[22m\e[0m\e[0m \n\e[0m\e[22m╭────────╮\e[22m\e[0m \n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m \n\e[0m\e[22m╰────────╯\e[22m\e[0m\e[0m \n\e[0m\e[22m╭─────────────╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰─────────────╯\e[22m\e[0m\e[0m" + "\e[0m\e[22m╭───╮\e[22m\e[0m \n\e[22m│\e[22m \e[22m│\e[22m \n\e[0m\e[22m╰───╯\e[22m\e[0m\e[0m \n\e[0m\e[22m╭────────╮\e[22m\e[0m \n\e[22m│\e[22m \e[22m│\e[22m \n\e[0m\e[22m╰────────╯\e[22m\e[0m\e[0m \n\e[0m\e[22m╭─────────────╮\e[22m\e[0m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[0m\e[22m╰─────────────╯\e[22m\e[0m\e[0m" @test p1 isa Panel @test p1.measure.w == 5 @@ -119,7 +119,7 @@ end @test pp isa Renderable @test pp.measure.w == 15 @test string(pp) == - " \e[0m\e[22m╭───╮\e[22m\e[0m \n \e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m \n \e[0m\e[22m╰───╯\e[22m\e[0m\e[0m \n \e[0m\e[22m╭────────╮\e[22m\e[0m \n \e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m \n \e[0m\e[22m╰────────╯\e[22m\e[0m\e[0m \n\e[0m\e[22m╭─────────────╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰─────────────╯\e[22m\e[0m\e[0m" + " \e[0m\e[22m╭───╮\e[22m\e[0m \n \e[22m│\e[22m \e[22m│\e[22m \n \e[0m\e[22m╰───╯\e[22m\e[0m\e[0m \n \e[0m\e[22m╭────────╮\e[22m\e[0m \n \e[22m│\e[22m \e[22m│\e[22m \n \e[0m\e[22m╰────────╯\e[22m\e[0m\e[0m \n\e[0m\e[22m╭─────────────╮\e[22m\e[0m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[0m\e[22m╰─────────────╯\e[22m\e[0m\e[0m" @test p1 isa Panel @test p1.measure.w == 5 @@ -128,7 +128,7 @@ end @test pp isa Renderable @test pp.measure.w == 15 @test string(pp) == - " \e[0m\e[22m╭───╮\e[22m\e[0m\n \e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n \e[0m\e[22m╰───╯\e[22m\e[0m\e[0m\n \e[0m\e[22m╭────────╮\e[22m\e[0m\n \e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n \e[0m\e[22m╰────────╯\e[22m\e[0m\e[0m\n\e[0m\e[22m╭─────────────╮\e[22m\e[0m\n\e[0m\e[22m│\e[22m \e[0m\e[22m│\e[22m\n\e[0m\e[22m╰─────────────╯\e[22m\e[0m\e[0m" + " \e[0m\e[22m╭───╮\e[22m\e[0m\n \e[22m│\e[22m \e[22m│\e[22m\n \e[0m\e[22m╰───╯\e[22m\e[0m\e[0m\n \e[0m\e[22m╭────────╮\e[22m\e[0m\n \e[22m│\e[22m \e[22m│\e[22m\n \e[0m\e[22m╰────────╯\e[22m\e[0m\e[0m\n\e[0m\e[22m╭─────────────╮\e[22m\e[0m\n\e[22m│\e[22m \e[22m│\e[22m\n\e[0m\e[22m╰─────────────╯\e[22m\e[0m\e[0m" @test p1 isa Panel @test p1.measure.w == 5 end diff --git a/test/10_test_inspect.jl b/test/10_test_inspect.jl index d3ff6c2f9..29e98c791 100644 --- a/test/10_test_inspect.jl +++ b/test/10_test_inspect.jl @@ -57,17 +57,17 @@ end dosmth(m::MyStr) = print(m.x) - intro = @capture_out begin - inspect(MyStr; methods = true, supertypes = true) - end - intro = remove_ansi(intro) - @test intro isa String + # intro = @capture_out begin + # inspect(MyStr; methods = true, supertypes = true) + # end + # intro = remove_ansi(intro) + # @test intro isa String # intro = @capture_out begin # inspect(Panel; methods = true, supertypes = true,) # end # @compare_to_string(intro, "introspection_panel") - @test_nothrow inspect(Panel; methods = true, supertypes = true) + # @test_nothrow inspect(Panel; methods = true, supertypes = true) intro = @capture_out begin inspect(print) diff --git a/test/11_test_theme.jl b/test/11_test_theme.jl index 6ebee2ec0..520680fed 100644 --- a/test/11_test_theme.jl +++ b/test/11_test_theme.jl @@ -31,11 +31,14 @@ end warn = "green", error = "bold #d13f3f", logmsg = "#8abeff", - tree_title = "green italic", - tree_node = "yellow italic", - tree_leaf = "yellow", - tree_guide = "red", - tree_max_width = 22, + tree_mid = "blue", + tree_terminator = "blue", + tree_skip = "blue", + tree_dash = "blue", + tree_trunc = "blue", + tree_pair = "red", + tree_keys = "green", + tree_max_leaf_width = 22, repr_accent = "green", repr_name = "yellow", repr_type = "red", diff --git a/test/13_test_logs.jl b/test/13_test_logs.jl index 85ee09a75..bffdc21e5 100644 --- a/test/13_test_logs.jl +++ b/test/13_test_logs.jl @@ -5,14 +5,20 @@ using Term.Progress import ProgressLogging import UUIDs: uuid4 +struct MyLogsStruct + x::String + y::Vector + z::Int +end + @testset "\e[34mLOGS test" begin install_term_logger() println("\nTesting logging, stdout temporarily disabled") - @suppress_out begin + output = @capture_out begin @info "my log!" - @warn "tell us if this was [bold red]undexpected![/bold red]" + @warn "tell us if this was {bold red}undexpected!{/bold red}" x = collect(1:2:20) y = x * x' @@ -27,15 +33,20 @@ import UUIDs: uuid4 sdfs s""" 1 + 2 + + @info MyStruct("aa a"^100, zeros(200), 4) end + + # IS_WIN || @compare_to_string output "logs.txt" + uninstall_term_logger() end -@testset "\e[34mLOGS handle_progress" begin - logger = TermLogger(devnull, TERM_THEME[]) - for fraction in (nothing, 0.0, 0.5, 1.0) - handle_progress(logger, ProgressLogging.Progress(id = uuid4(), fraction = fraction)) - end +# @testset "\e[34mLOGS handle_progress" begin +# logger = TermLogger(devnull, TERM_THEME[]) +# for fraction in (nothing, 0.0, 0.5, 1.0) +# handle_progress(logger, ProgressLogging.Progress(id = uuid4(), fraction = fraction)) +# end - @test true -end +# @test true +# end diff --git a/test/16_test_tree.jl b/test/16_test_tree.jl index 58e10170e..a8a53976f 100644 --- a/test/16_test_tree.jl +++ b/test/16_test_tree.jl @@ -1,104 +1,84 @@ -import Term: Tree +import Term: Tree, TERM_THEME, LightTheme import OrderedCollections: OrderedDict -tree_dict = Dict( - "nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfdsfsdfd" => - Dict("n1" => 1, "n2" => 2), -) - -tree_dict_1 = - Dict("nested" => Dict("n1" => 1, "n2" => 2), "nested2" => Dict("n1" => "a", "n2" => 2)) - -tree_dict_2 = Dict( - "nested" => Dict("n1" => 1, "n2" => 2), - "leaf2" => 2, - "leaf" => 2, - "leafme" => "v", - "canopy" => "test", - ["a"] => :test, -) - -tree_dict_3 = Dict( - "nested" => Dict( - "deeper" => Dict("aleaf" => "unbeliefable", "leaflet" => "level 3"^20), - "n2" => Int, - "n3" => 1 + 2, +trees = [ + Dict( + "nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfdsfsdfd" => + Dict("n1" => 1, "n2" => 2), ), - "nested2" => Dict("n1" => "a", "n2" => 2), -) - -tree_dict_4 = Dict( - "nested" => Dict( - "deeper" => Dict( - "aleaf" => "unbeliefable", - "leaflet" => "level 3", - "sodeep" => Dict("a" => 4), + Dict("nested" => Dict("n1" => 1, "n2" => 2), "nested2" => Dict("n1" => "a", "n2" => 2)), + Dict( + "nested" => Dict("n1" => 1, "n2" => 2), + "leaf2" => 2, + "leaf" => 2, + "leafme" => "v", + "canopy" => "test", + ["a"] => :test, + ), + Dict( + "nested" => Dict( + "deeper" => Dict("aleaf" => "unbeliefable", "leaflet" => "level 3"^20), + "n2" => Int, + "n3" => 1 + 2, ), - "n2" => Int, - "n3" => 1 + 2, - "adict" => Dict("x" => 2), + "nested2" => Dict("n1" => "a", "n2" => 2), ), - "nested2" => Dict("n1" => "a", "n2" => 2), -) - -tree_dict_order_1 = - OrderedDict(3 => OrderedDict(3 => 8, 1 => "a"), 2 => OrderedDict(3 => 8, 1 => "a")) - -tree_dict_order_2 = OrderedDict(2 => 1, 3 => OrderedDict(4 => 2, "a" => 2, "b" => 1)) + Dict( + "nested" => Dict( + "deeper" => Dict( + "aleaf" => "unbeliefable", + "leaflet" => "level 3", + "sodeep" => Dict("a" => 4), + ), + "n2" => Int, + "n3" => 1 + 2, + "adict" => Dict("x" => 2), + ), + "nested2" => Dict("n1" => "a", "n2" => 2), + ), + OrderedDict(3 => OrderedDict(3 => 8, 1 => "a"), 2 => OrderedDict(3 => 8, 1 => "a")), + OrderedDict(2 => 1, 3 => OrderedDict(4 => 2, "a" => 2, "b" => 1)), + [1, 2, [2, 3, 4]], + [ + 1, + [2, [3, 4], "a"^200], + :c, + OrderedDict(2 => "a", 1 => :ok, "a" => 2, :test => [1, 2]), + ], + Int, + String, + :(print, :(x, y)), +] @testset "\e[34mTree" begin - # creation - @testtree(Tree(tree_dict), 6, 50) - - @testtree(Tree(tree_dict_1), 9, 15) - - @testtree(Tree(tree_dict_2), 11, 18) - - @testtree(Tree(tree_dict_3), 12, 66) - - @testtree(Tree(tree_dict_4), 16, 33) - - @testtree(Tree(tree_dict_order_1), 9, 14) - @testtree(Tree(tree_dict_order_2), 8, 14) - - # styling - for guides_type in (:standardtree, :boldtree, :asciitree) - @test_nothrow Tree( - tree_dict; - title = string(guides_type), - guides_type = guides_type, - ) + thm1 = TERM_THEME[] + thm2 = LightTheme + + for (i, theme) in enumerate((thm1, thm2)) + for (j, guides_type) in enumerate((:standardtree, :boldtree, :asciitree)) + for (k, tree) in enumerate(trees) + if VERSION ≥ v"1.7" # ! not sure why but this fails in older versions: segmentation fault + IS_WIN || @compare_to_string string( + Tree( + tree; + theme = theme, + guides = guides_type, + printkeys = true, + title = "tree_$(i)_$(j)_$(k)", + ), + ) "tree_$(i)_$(j)_$(k)" + end + end + end end - @testtree( - Tree( - tree_dict; - title = "my colors", - title_style = "bold red", - node_style = "blue underline", - leaf_style = "green", - guides_style = "red dim", - ), - 6, - 52, - ) - # test with no errors @test_nothrow Tree(Float64) @test_nothrow Tree(AbstractFloat) - # compare to string - (VERSION < v"1.7.1" || IS_WIN) || begin - @compare_to_string string(Tree(tree_dict)) "tree_1" - @compare_to_string string(Tree(tree_dict_1)) "tree_2" - @compare_to_string string(Tree(tree_dict_2)) "tree_3" - @compare_to_string string(Tree(tree_dict_3)) "tree_4" - @compare_to_string string(Tree(tree_dict_order_1)) "tree_5" - @compare_to_string string(Tree(tree_dict_order_2)) "tree_6" - end - # test printing - @test sprint(io -> show(io, Tree(tree_dict_1))) == "Tree: 2 nodes, 0 leaves | Idx: 0" - @test sprint(io -> show(io, MIME("text/plain"), Tree(tree_dict_1).segments[1])) == - "Segment{String} \e[2m(size: Measure (h: 1, w: 15))\e[0m" + @test sprint(io -> show(io, Tree(trees[1]))) == + "\e[38;5;117mTree <: AbstractRenderable\e[0m \e[2m(h:10, w:80)\e[0m" + @test sprint(io -> show(io, MIME("text/plain"), Tree(trees[1]).segments[1])) == + "Segment{String} \e[2m(size: Measure (h: 1, w: 80))\e[0m" end diff --git a/test/19_test_repr.jl b/test/19_test_repr.jl index 1a46ddb94..fabcd7465 100644 --- a/test/19_test_repr.jl +++ b/test/19_test_repr.jl @@ -29,6 +29,20 @@ end IS_WIN || @compare_to_string sprint(termshow, Rocket) "repr_rocket_struct" IS_WIN || @compare_to_string sprint(termshow, T()) "repr_T_struct" end + + @with_repr struct MyTestStruct3 + x::String + y::Array + z::Int + a::Panel + c::String + end + + mts = MyTestStruct3("aa aa"^100, zeros(100, 100), 3, Panel(), "b b b"^100) + + VERSION ≥ v"1.7" && begin + IS_WIN || @compare_to_string sprint(termshow, mts) "mts_repr" + end end @testset "REPR @with_repr with doc" begin @@ -48,6 +62,10 @@ end @compare_to_string sprint(io -> show(io, MIME("text/plain"), Rocket2)) "repr_rocket_2_show" end +"test function" +fn(x::Int) = x +fn(s::String) = s + objs = if VERSION >= v"1.7.1" ( (1, [1, 2, 3]), @@ -56,7 +74,7 @@ objs = if VERSION >= v"1.7.1" (4, zeros(120, 300)), (5, zeros(200)), (6, zeros(3, 3, 3)), - (7, clear), + (7, fn), (8, :(x / y + √9)), (9, zeros(10)), (10, zeros(5, 5)), @@ -67,7 +85,7 @@ else (1, [1, 2, 3]), (2, Dict(:x => [1, 2, 3], "a" => Dict(:z => "a"))), (3, Dict(i => i for i in 1:100)), - (7, clear), + (7, fn), ) end diff --git a/test/20_test_compositor.jl b/test/20_test_compositor.jl index f0f380f01..cf77763e5 100644 --- a/test/20_test_compositor.jl +++ b/test/20_test_compositor.jl @@ -37,11 +37,11 @@ end @test_logs (:warn, r"Could not update compositor") update!(C4, :FOO, Panel()) C5 = Compositor(:(A(100, 55) * B(20, 15))) - @test_logs (:warn, r"Shape mismatch while updating compositor element") update!( - C5, - :A, - Panel(), - ) + # @test_logs (:warn, r"Shape mismatch while updating compositor element") update!( + # C5, + # :A, + # Panel(; width=20), + # ) compositors = [C1, C1_b, C2, C3] diff --git a/test/26_test_live.jl b/test/26_test_live.jl new file mode 100644 index 000000000..72cd5f15a --- /dev/null +++ b/test/26_test_live.jl @@ -0,0 +1,385 @@ +using Term.LiveWidgets +import Term.LiveWidgets: + ArrowDown, + ArrowUp, + ArrowLeft, + ArrowRight, + DelKey, + HomeKey, + EndKey, + PageUpKey, + PageDownKey, + Enter, + SpaceBar, + Esc, + Del + +import Term.LiveWidgets: + newline, + addspace, + del, + addchar, + WidgetInternals, + PlaceHolderWidget, + menu_activate_next, + menu_return_value, + multi_select_toggle, + next_page, + next_line, + prev_page, + prev_line, + home, + toend, + activate_next_widget, + activate_prev_widget, + AppInternals, + toggle_help, + get_active, + on_layout_change + +import Term.Compositors: Compositor +import Term.Consoles: Console, enable, disable +import Term: Measure, AbstractRenderable + +import OrderedCollections: OrderedDict + +# ---------------------------------------------------------------------------- # +# basic widgets # +# ---------------------------------------------------------------------------- # + +@testset "WidgetInternals" begin + w = TextWidget("a") + + @test w.internals.active isa Bool + @test w.internals.measure isa Measure + @test isnothing(w.internals.on_draw) + @test w.internals.on_activated isa Function + @test w.internals.on_deactivated isa Function +end + +@testset "TextWidget" begin + texts = ["test", "This is long test"^25] + panel = [true, false] + + for (i, t) in enumerate(texts), (j, p) in enumerate(panel) + widget = TextWidget(t; as_panel = p) + asframe = frame(widget) + + IS_WIN || @compare_to_string(asframe, "widget_text_$(i)_$(j)") + + @test asframe isa AbstractRenderable + @test widget.controls isa AbstractDict + @test widget.internals isa WidgetInternals + end +end + +@testset "InputBox" begin + ib = InputBox() + + @test isnothing(ib.input_text) + addchar(ib, 'a') + addchar(ib, 'b') + del(ib, Del()) + addspace(ib, SpaceBar()) + newline(ib, Enter()) + addchar(ib, 'c') + + @test ib.input_text == "a \nc" + @test ib.controls isa AbstractDict + @test ib.internals isa WidgetInternals + @test ib.internals.measure == Measure(5, 80) + + as_frame = frame(ib) + @test as_frame isa AbstractRenderable + IS_WIN || @compare_to_string as_frame "widget_inputbox" +end + +@testset "PlaceHolderWidget" begin + ph = PlaceHolderWidget(5, 20, "test", "red") + + @test ph.controls isa AbstractDict + @test ph.internals isa WidgetInternals + @test ph.internals.measure == Measure(5, 20) + + as_frame = frame(ph) + @test as_frame isa AbstractRenderable + IS_WIN || @compare_to_string as_frame "widget_placeholder" +end + +# ---------------------------------------------------------------------------- # +# MENU # +# ---------------------------------------------------------------------------- # + +@testset "SimpleMenu" begin + for (i, w) in enumerate((50, 100)) + for (j, orientation) in enumerate((:vertical, :horizontal)) + for (k, style) in enumerate(("red", "green")) + mn = SimpleMenu( + ["one", "two", "three"]; + width = w, + layout = orientation, + active_style = style, + inactive_style = "dim", + ) + + @test mn.controls isa AbstractDict + @test mn.internals isa WidgetInternals + + # if orientation != :vertical + # @test mn.internals.measure == Measure(3, w) + # else + # @test mn.internals.measure == Measure(w, 3) + # end + + IS_WIN || @compare_to_string frame(mn) "widget_simplemenu_$(i)_$(j)_$(k)" + + menu_activate_next(mn, 1) + IS_WIN || @compare_to_string frame(mn) "widget_simplemenu_$(i)_$(j)_$(k)_b" + + @test menu_return_value(mn, Enter()) == 2 + end + end + end +end + +@testset "ButtonsMenu" begin + for (i, w) in enumerate((50, 100)) + for (j, orientation) in enumerate((:vertical, :horizontal)) + for (k, style) in enumerate(("red", "green")) + for (l, height) in enumerate((5, 10)) + mn = ButtonsMenu( + ["one", "two", "three"]; + width = w, + layout = orientation, + active_style = style, + inactive_style = "dim", + height = height, + ) + + @test mn.controls isa AbstractDict + @test mn.internals isa WidgetInternals + + # if orientation == :vertical + # @test mn.internals.measure == Measure(height, w) + # else + # @test mn.internals.measure == Measure(w, height) + # end + + IS_WIN || + @compare_to_string frame(mn) "widget_buttonsmenu_$(i)_$(j)_$(k)_($l)" + + menu_activate_next(mn, 1) + IS_WIN || + @compare_to_string frame(mn) "widget_buttonsmenu_$(i)_$(j)_$(k)_$(l)_b" + + @test menu_return_value(mn, Enter()) == 2 + end + end + end + end +end + +@testset "MultiSelectMenu" begin + for (i, w) in enumerate((50, 100)) + for (k, style) in enumerate(("red", "green")) + mn = MultiSelectMenu( + ["one", "two", "three"]; + width = w, + active_style = style, + inactive_style = "dim", + ) + + @test mn.controls isa AbstractDict + @test mn.internals isa WidgetInternals + @test mn.internals.measure == Measure(3, w) + + IS_WIN || @compare_to_string frame(mn) "widget_multiselectmenu_$(i)_$(k)" + + menu_activate_next(mn, 1) + IS_WIN || @compare_to_string frame(mn) "widget_multiselectmenu_$(i)_$(k)_b" + + multi_select_toggle(mn, SpaceBar()) + @test menu_return_value(mn, Enter()) == [2] + end + end +end + +# ---------------------------------------------------------------------------- # +# Pager & Gallery # +# ---------------------------------------------------------------------------- # + +@testset "Pager" begin + txt = + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor\nincididunt ut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation\nullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in\nvoluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserun\n mollit anim id est laborum."^5 + + for (i, w) in enumerate((30, 60)) + for (j, h) in enumerate((20, 40)) + for (k, ln) in enumerate((true, false)) + pag = Pager(txt; width = w, height = h, line_numbers = ln, title = "test") + + @test pag.controls isa AbstractDict + @test pag.internals isa WidgetInternals + @test pag.internals.measure == Measure(h, w) + @test pag.content isa Vector{String} + + LiveWidgets.prev_line(pag, 'a') + LiveWidgets.next_line(pag, 'a') + LiveWidgets.prev_line(pag, 'a') + next_page(pag, 'a') + prev_page(pag, 'a') + next_page(pag, 'a') + + home(pag, HomeKey()) + toend(pag, EndKey()) + prev_page(pag, ArrowLeft()) + + IS_WIN || @compare_to_string frame(pag) "widget_pager_$(i)_$(j)_$(k)" + end + end + end +end + +@testset "Gallery" begin + for (i, w) in enumerate((56, 80)) + for (j, h) in enumerate((20, 40)) + for (k, sp) in enumerate((true, false)) + gal = Gallery( + [TextWidget("aaa"), Pager("aaa" .^ 200)]; + height = h, + width = w, + show_panel = sp, + ) + + @test gal.internals isa WidgetInternals + @test gal.controls isa AbstractDict + @test gal.widgets isa Vector + + IS_WIN || @compare_to_string frame(gal) "widget_gal_$(i)_$(j)_$(k)" + + activate_prev_widget(gal, 1) + activate_next_widget(gal, 1) + activate_next_widget(gal, 1) + + IS_WIN || @compare_to_string frame(gal) "widget_gal_$(i)_$(j)_$(k)_b" + + @test get_active(gal) isa AbstractWidget + end + end + end +end + +# ---------------------------------------------------------------------------- # +# APP # +# ---------------------------------------------------------------------------- # + +@testset "App Layout Only" begin + layout = :((r(10, 0.5) * g(10, 0.5)) / b(10, 1.0)) + + for (j, h) in enumerate((20, 40)) + for (k, e) in enumerate((true, false)) + app = App( + layout; + height = h, + expand = e, + help_message = """ + This is just an example of how to create a simple app without any specific content. + + !!! note + You can make apps too! + """, + ) + + @test app.internals isa AppInternals + @test app.measure isa Measure + @test app.controls isa AbstractDict + @test app.widgets isa AbstractDict + @test app.compositor isa Compositor + + IS_WIN || @compare_to_string frame(app) "single_widghet_app_$(j)_$(k)" + + IS_WIN || + @compare_to_string sprint(print, app) "single_widghet_app_$(j)_$(k)_print" + + toggle_help(app) + IS_WIN || @compare_to_string frame(app) "single_widghet_app_$(j)_$(k)_help" + toggle_help(app) + IS_WIN || @compare_to_string frame(app) "single_widghet_app_$(j)_$(k)_nohelp" + + sleep(1) + end + end +end + +@testset "App Single Widget" begin + for (i, w) in enumerate((0.5, 20)) + for (j, h) in enumerate((20, 40)) + for (k, e) in enumerate((true, false)) + app = App(TextWidget("a"^100); width = w, height = h, expand = e) + + @test app.internals isa AppInternals + @test app.measure isa Measure + @test app.controls isa AbstractDict + @test app.widgets isa AbstractDict + @test app.compositor isa Compositor + + # IS_WIN || @compare_to_string frame(app) "app_single_widget_$(i)_$(j)_$(k)" + + # IS_WIN || + # @compare_to_string sprint(print, app) "app_single_widget_$(i)_$(j)_$(k)_print" + + # toggle_help(app) + # IS_WIN || + # @compare_to_string frame(app) "app_single_widget_$(i)_$(j)_$(k)_help" + # toggle_help(app) + # IS_WIN || + # @compare_to_string frame(app) "app_single_widget_$(i)_$(j)_$(k)_nohelp" + + # c1, c2 = Console(30), Console(90) + + # for (m, c) in enumerate((c1, c2, c1)) + # enable(c) + # on_layout_change(app) + # # IS_WIN || + # # @compare_to_string frame(app) "app_single_widget_$(i)_$(j)_$(k)_$(m)" + # disable(c) + # end + + sleep(1) + end + end + end +end + +@testset "App complete" begin + rgb_visualizer = TextWidget("") + + R = InputBox(title = "R value", style = "red", title_justify = :center) + G = InputBox(title = "G value", style = "green", title_justify = :center) + B = InputBox(title = "B value", style = "blue", title_justify = :center) + + button = Button("random"; color = "light_slate_grey", text_color = "white") + + widgets = OrderedDict{Symbol,AbstractWidget}( + :A => rgb_visualizer, + :R => R, + :G => G, + :B => B, + :b => button, + ) + + layout = :(A(22, 0.4) * (R(6, 0.6) / G(6, 0.6) / B(6, 0.6) / b(4, 0.6))) + app = App(layout; widgets = widgets) + + # IS_WIN || @compare_to_string frame(app) "app_complete" + + # c1, c2 = Console(30), Console(90) + + # for (m, c) in enumerate((c1, c2, c1)) + # enable(c) + # on_layout_change(app) + # # IS_WIN || @compare_to_string frame(app) "app_complete_$(m)" + # disable(c) + # end + + # sleep(1) +end diff --git a/test/__test_utils.jl b/test/__test_utils.jl index e7a6d05f6..af28a593f 100644 --- a/test/__test_utils.jl +++ b/test/__test_utils.jl @@ -26,7 +26,7 @@ and clean it up """ fromfile(filepath) = replace_multi(read(filepath, String), "\\n" => "\n", "\\e" => "\e") -fromfilelines(filepath) = lines = readlines(filepath) +fromfilelines(filepath) = readlines(filepath) """ Highlight different characters between two strings. @@ -50,7 +50,7 @@ function highlight_diff(s1::String, s2::String; stop = 500) hLine("FIRST", style = "blue") |> tprint println(s1) hLine("SECOND", style = "blue") |> tprint - println(s1) + println(s2) hLine(style = "dim blue") |> tprint i = 1 diff --git a/test/runtests.jl b/test/runtests.jl index 40f79d45f..8d38787fe 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -62,6 +62,7 @@ end @runner "23_test_link.jl" @runner "24_prompts.jl" @runner "25_annotations.jl" +@runner "26_test_live.jl" @runner "98_test_examples.jl" @runner "99_test_errors.jl" diff --git a/test/txtfiles/annotations_1.txt b/test/txtfiles/annotations_1.txt index 9968476c9..468fc45b5 100644 --- a/test/txtfiles/annotations_1.txt +++ b/test/txtfiles/annotations_1.txt @@ -1,17 +1,17 @@ Panel(content; fit=true) -──┬── ───┬─── ────┬─── +──┬── ───┬─── ────┬─── │ │ │ │ ╭───────────────────────────────────────╮ - ╰─│ this is the struct constructor call │ + ╰─│ this is the struct constructor call │ ╰───────────────────────────────────────╯ │ │ │ ╭───────────────────────────────────────────╮ - ╰─│ here you put what goes inside the panel │ + ╰─│ here you put what goes inside the panel │ ╰───────────────────────────────────────────╯ │ │ ╭───────────────────────────────────────╮ - ╰─│ Setting this as `true` adjusts │ - │ the panel's width to fit `content` │ - │ . Otherwise `Panel` will have │ - │ a fixed width │ + ╰─│ Setting this as `true` adjusts │ + │ the panel's width to fit `content` │ + │ . Otherwise `Panel` will have │ + │ a fixed width │ ╰───────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/annotations_2.txt b/test/txtfiles/annotations_2.txt index f6de8d9f3..7a861e8b7 100644 --- a/test/txtfiles/annotations_2.txt +++ b/test/txtfiles/annotations_2.txt @@ -1,32 +1,32 @@ This is an example of an annotation to display nicely some info - ───┬─── ─────┬──── ────┬──── + ───┬─── ─────┬──── ────┬──── │ │ │ │ ╭───────────────────────────────────────────╮ - ╰─│ very simple but important, pay attenti  │ - │ on!  │ + ╰─│ very simple but important, pay attenti  │ + │ on!  │ ╰───────────────────────────────────────────╯ │ │ │ ╭────────────╮ │ - ╰─│ is it  │ │ - │ helpful? │ │ + ╰─│ is it  │ │ + │ helpful? │ │ ╰────────────╯ │ │ │ ╭─────╮ - ╰─│ h │ - │ o │ - │ p │ - │ e │ - │ f │ - │ u │ - │ l │ - │ l │ - │ y │ - │  │ - │ u │ - │ s │ - │ e │ - │ f │ - │ u │ - │ l │ - │  │ + ╰─│ h │ + │ o │ + │ p │ + │ e │ + │ f │ + │ u │ + │ l │ + │ l │ + │ y │ + │  │ + │ u │ + │ s │ + │ e │ + │ f │ + │ u │ + │ l │ + │  │ ╰─────╯ \ No newline at end of file diff --git a/test/txtfiles/annotations_3.txt b/test/txtfiles/annotations_3.txt index d3d1bad44..407925ef5 100644 --- a/test/txtfiles/annotations_3.txt +++ b/test/txtfiles/annotations_3.txt @@ -1,32 +1,32 @@ This is an example of an annotation to display nicely some info - ───┬─── ─────┬──── ────┬──── + ───┬─── ─────┬──── ────┬──── │ │ │ │ ╭───────────────────────────────────────────╮ - ╰─│ very simple but important, pay attenti  │ - │ on!  │ + ╰─│ very simple but important, pay attenti  │ + │ on!  │ ╰───────────────────────────────────────────╯ │ │ │ ╭────────────╮ │ - ╰─│ is it  │ │ - │ helpful? │ │ + ╰─│ is it  │ │ + │ helpful? │ │ ╰────────────╯ │ │ │ ╭─────╮ - ╰─│ h │ - │ o │ - │ p │ - │ e │ - │ f │ - │ u │ - │ l │ - │ l │ - │ y │ - │  │ - │ u │ - │ s │ - │ e │ - │ f │ - │ u │ - │ l │ - │  │ + ╰─│ h │ + │ o │ + │ p │ + │ e │ + │ f │ + │ u │ + │ l │ + │ l │ + │ y │ + │  │ + │ u │ + │ s │ + │ e │ + │ f │ + │ u │ + │ l │ + │  │ ╰─────╯ \ No newline at end of file diff --git a/test/txtfiles/annotations_4.txt b/test/txtfiles/annotations_4.txt index 234fdea73..560877aa6 100644 --- a/test/txtfiles/annotations_4.txt +++ b/test/txtfiles/annotations_4.txt @@ -1,34 +1,34 @@ This is an example of an annotation to display nicely some info - ───┬─── ─────┬──── ────┬──── + ───┬─── ─────┬──── ────┬──── │ │ │ │ ╭───────────────────────────────────────────╮ - ╰─│ very simple but important, pay attenti  │ - │ on!  │ + ╰─│ very simple but important, pay attenti  │ + │ on!  │ ╰───────────────────────────────────────────╯ │ │ │ ╭─────────────────────────────╮ - ╰─│ is it helpful? This  │ - │ is a very long message  │ - │ to check that everything  │ - │  is working correctly  │ + ╰─│ is it helpful? This  │ + │ is a very long message  │ + │ to check that everything  │ + │  is working correctly  │ ╰─────────────────────────────╯ │ │ ╭─────╮ - ╰─│ h │ - │ o │ - │ p │ - │ e │ - │ f │ - │ u │ - │ l │ - │ l │ - │ y │ - │  │ - │ u │ - │ s │ - │ e │ - │ f │ - │ u │ - │ l │ - │  │ + ╰─│ h │ + │ o │ + │ p │ + │ e │ + │ f │ + │ u │ + │ l │ + │ l │ + │ y │ + │  │ + │ u │ + │ s │ + │ e │ + │ f │ + │ u │ + │ l │ + │  │ ╰─────╯ \ No newline at end of file diff --git a/test/txtfiles/annotations_5.txt b/test/txtfiles/annotations_5.txt index c36eb949c..3c14300d1 100644 --- a/test/txtfiles/annotations_5.txt +++ b/test/txtfiles/annotations_5.txt @@ -1,6 +1,6 @@ this has some style - ──┬── + ──┬── │ │ ╭────────────────────────────────────────╮ - ╰─│ style means color or stuff like bold │ + ╰─│ style means color or stuff like bold │ ╰────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/annotations_6.txt b/test/txtfiles/annotations_6.txt index ba2394f77..216c36430 100644 --- a/test/txtfiles/annotations_6.txt +++ b/test/txtfiles/annotations_6.txt @@ -1,15 +1,15 @@ -╭────────────────────── Annotation: usage ─────────────────────╮ -│ │ -│ │ -│ Annotation("main text", "main"=>"most important") │ -│ ─────┬───── ────────────┬─────────── │ -│ │ │ │ -│ │ ╭────────────────────────────────╮ │ -│ ╰─│ main message to be annotated │ │ -│ ╰────────────────────────────────╯ │ -│ │ │ -│ │ ╭──────────────╮ │ -│ ╰─│ annotation │ │ -│ ╰──────────────╯ │ -│ │ +╭────────────────────── Annotation: usage ─────────────────────╮ +│ │ +│ │ +│ Annotation("main text", "main"=>"most important") │ +│ ─────┬───── ────────────┬─────────── │ +│ │ │ │ +│ │ ╭────────────────────────────────╮ │ +│ ╰─│ main message to be annotated │ │ +│ ╰────────────────────────────────╯ │ +│ │ │ +│ │ ╭──────────────╮ │ +│ ╰─│ annotation │ │ +│ ╰──────────────╯ │ +│ │ ╰──────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/automatic_repr_1.txt b/test/txtfiles/automatic_repr_1.txt index fb83b76f1..992a49ff7 100644 --- a/test/txtfiles/automatic_repr_1.txt +++ b/test/txtfiles/automatic_repr_1.txt @@ -1,5 +1,6 @@ -╭──── Dict {Int64, Symbol}  ──────╮ -│ │ -│  {Int64} │ 1 => x │ {Symbol}  │ -│ │ -╰────────────────────── 1 item ───╯ +╭──── Dict {Int64, Symbol}  ──────╮ +│ │ +│   {Int64}  1 => x  {Symbol}   │ +│   │ +│ │ +╰─────────────────────────────────╯ diff --git a/test/txtfiles/automatic_repr_2.txt b/test/txtfiles/automatic_repr_2.txt index 1a22848f9..e4e32bc90 100644 --- a/test/txtfiles/automatic_repr_2.txt +++ b/test/txtfiles/automatic_repr_2.txt @@ -1,6 +1,7 @@ -╭─────────────────────────────────╮ -│ x + y │ -│ ───────────────────────────── │ -│ head::Symbol│ call │ -│ args::Vector│ Any[:+, :x, :y] │ -╰──────────────────────── Expr ───╯ +╭──────────────────────────────────╮ +│ x + y │ +│ ────────────────────────────── │ +│  head::Symbol  call   │ +│  args::Vector Any[:+, :x, :y]  │ +│   │ +╰───────────────────────── Expr ───╯ diff --git a/test/txtfiles/automatic_repr_showme_1.txt b/test/txtfiles/automatic_repr_showme_1.txt index ea149a04d..81f2b1519 100644 --- a/test/txtfiles/automatic_repr_showme_1.txt +++ b/test/txtfiles/automatic_repr_showme_1.txt @@ -1,6 +1,6 @@ ──────────────────────────────────────────────────────────────────────────────── - ╭──── @showme ─────────────────────────────────────────────────────────╮ - │ Showing definition for method called by: `tprint(stdout, "test")` │ + ╭──── @showme ─────────────────────────────────────────────────────────╮ + │ Showing definition for method called by: `tprint(stdout, "test")` │ ╰──────────────────────────────────────────────────────────────────────╯ Arguments @@ -8,15 +8,15 @@ ⨀ "test"::String Method definition -┌────────────────────────────────────────────────────────────────────┐ -│ function tprint(io::IO, x::AbstractString; highlight = true)  │ -│  x = (highlight ? apply_style ∘ highlighter : apply_style)(  │ -│ x)  │ -│   │ -│  x =  │ -│  Measure(x).w <= console_width(io) ? x :  │ -│  string(RenderableText(string(x), width = console_width  │ -│ (io)))  │ -│  print(io, x)  │ -│ end  │ -└────────────────────────────────────────────────────────────────────┘ \ No newline at end of file +┌────────────────────────────────────────────────────────────────────┐ +│ function tprint(io::IO, x::AbstractString; highlight = true)  │ +│  x = (highlight ? apply_style ∘ highlighter : apply_style)(  │ +│ x)  │ +│   │ +│  x =  │ +│  Measure(x).w <= console_width(io) ? x :  │ +│  string(RenderableText(string(x), width = console_width  │ +│ (io)))  │ +│  print(io, x)  │ +│ end  │ +└────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/backtrace_1.txt b/test/txtfiles/backtrace_1.txt deleted file mode 100644 index 7685fbba9..000000000 --- a/test/txtfiles/backtrace_1.txt +++ /dev/null @@ -1,27 +0,0 @@ -╭──── Error Stack ─────────────────────────────────────────────────────────────╮ -│ │ -│ ──────────────────────────── In module Base ──────────────────────────── │ -│ │ -│ ╭───────────────────────────────────────────────────────────╮ │ -│ (1) │ _start() │ │ -│ ╰───────────────────────────────────────────── TOP LEVEL ───╯ │ -│ │ -│ ──────────────────────────────────────────────────────────────────────── │ -│  Skipped 18 frames in Base, Main  │ -│ ──────────────────────────────────────────────────────────────────────── │ -│ │ -│ ──────────────────────────── In module Main ──────────────────────────── │ -│ │ -│ ╭───────────────────────────────────────────────────────────╮ │ -│ │ f0 │ │ -│ │ inlined │ │ -│ │ │ ╭───────────────────────────────────────╮ │ │ -│ │ ╰─│ 104  f1(x) = 3x │ │ │ -│ (20) │ │ 105  f0(x; kwargs...) = begin │ │ │ -│ │ │❯ 106  st = stacktrace() │ │ │ -│ │ │ 107  ctx = StacktraceCont... │ │ │ -│ │ │ 108  bt = render_backtrac... │ │ │ -│ │ ╰───────────── error line ──────────────╯ │ │ -│ ╰──────────────────────────────────────────── ERROR LINE ───╯ │ -│ │ -╰──── Error Stack ─────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/backtrace_2.txt b/test/txtfiles/backtrace_2.txt deleted file mode 100644 index f2be0b1e1..000000000 --- a/test/txtfiles/backtrace_2.txt +++ /dev/null @@ -1,86 +0,0 @@ -╭──── Error Stack ─────────────────────────────────────────────────────────────╮ -│ │ -│ ──────────────────────────── In module Base ──────────────────────────── │ -│ │ -│ ╭───────────────────────────────────────────────────────────╮ │ -│ (1) │ _start() │ │ -│ ╰───────────────────────────────────────────── TOP LEVEL ───╯ │ -│ │ -│ (2) exec_options(opts::Base.JLOptions) │ -│ │ -│ (3) eval │ -│ inlined │ -│ │ -│ (4) top-level scope │ -│ │ -│ (5) include(fname::String) │ -│ │ -│ (6) _include(mapexpr::Function, mod::Module, _path::S │ -│ tring) │ -│ │ -│ (7) include_string(mapexpr::typeof(identity), mod::Mo │ -│ dule, code::String, filename::String) │ -│ │ -│ (8) eval │ -│ inlined │ -│ │ -│ top-level scope │ -│ (9) │ ╭────────────────────────────────╮ │ -│ ╰─│❯ 32 @time @timeit_include($fn) │ │ -│ ╰────────────────────────────────╯ │ -│ │ -│ (10) macro expansion │ -│ inlined │ -│ │ -│ macro expansion │ -│ inlined │ -│ (11) │ ╭──────────────────────────╮ │ -│ ╰─│❯ 237 $(Expr(:tryfinally, │ │ -│ ╰──────────────────────────╯ │ -│ │ -│ (12) include │ -│ inlined │ -│ │ -│ (13) _include(mapexpr::Function, mod::Module, _path::S │ -│ tring) │ -│ │ -│ (14) include_string(mapexpr::typeof(identity), mod::Mo │ -│ dule, code::String, filename::String) │ -│ │ -│ (15) eval │ -│ inlined │ -│ │ -│ top-level scope │ -│ (16) │ ╭─────────────────╮ │ -│ ╰─│❯ 103 f2(x) = 2x │ │ -│ ╰─────────────────╯ │ -│ │ -│ (17) macro expansion │ -│ inlined │ -│ │ -│ macro expansion │ -│ inlined │ -│ (18) │ ╭──────────────────────────────────────╮ │ -│ ╰─│❯ 113 bt2 = f0(f2(f1(2)); hide_fra... │ │ -│ ╰──────────────────────────────────────╯ │ -│ │ -│ ──────────────────────────── In module Main ──────────────────────────── │ -│ │ -│ f0#22(x::Int64; hide_frames::Bool) │ -│ (19) │ ╭───────────────────────────────╮ │ -│ ╰─│❯ 105 f0(x; kwargs...) = begin │ │ -│ ╰───────────────────────────────╯ │ -│ │ -│ ╭───────────────────────────────────────────────────────────╮ │ -│ │ f0 │ │ -│ │ inlined │ │ -│ │ │ ╭───────────────────────────────────────╮ │ │ -│ │ ╰─│ 104  f1(x) = 3x │ │ │ -│ (20) │ │ 105  f0(x; kwargs...) = begin │ │ │ -│ │ │❯ 106  st = stacktrace() │ │ │ -│ │ │ 107  ctx = StacktraceCont... │ │ │ -│ │ │ 108  bt = render_backtrac... │ │ │ -│ │ ╰───────────── error line ──────────────╯ │ │ -│ ╰──────────────────────────────────────────── ERROR LINE ───╯ │ -│ │ -╰──── Error Stack ─────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/centered_titile_panel_7.txt b/test/txtfiles/centered_titile_panel_7.txt index 390bdcaf6..c597051e6 100644 --- a/test/txtfiles/centered_titile_panel_7.txt +++ b/test/txtfiles/centered_titile_panel_7.txt @@ -1,3 +1,3 @@ -╭──── test ──────────╮ -│ │ -╰────────── aaaaa ───╯ \ No newline at end of file +╭──── test ──────────╮ +│ │ +╰────────── aaaaa ───╯ \ No newline at end of file diff --git a/test/txtfiles/centered_title_panel_1.txt b/test/txtfiles/centered_title_panel_1.txt index 184129a56..e4e23bfa6 100644 --- a/test/txtfiles/centered_title_panel_1.txt +++ b/test/txtfiles/centered_title_panel_1.txt @@ -1,3 +1,3 @@ -╭──── test ────────────────────────────╮ -│ │ +╭──── test ────────────────────────────╮ +│ │ ╰──────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/centered_title_panel_2.txt b/test/txtfiles/centered_title_panel_2.txt index 08ef96817..37c9d242d 100644 --- a/test/txtfiles/centered_title_panel_2.txt +++ b/test/txtfiles/centered_title_panel_2.txt @@ -1,3 +1,3 @@ -╭──────────────── test ────────────────╮ -│ │ +╭──────────────── test ────────────────╮ +│ │ ╰──────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/centered_title_panel_3.txt b/test/txtfiles/centered_title_panel_3.txt index f978c5c40..1ccb25f60 100644 --- a/test/txtfiles/centered_title_panel_3.txt +++ b/test/txtfiles/centered_title_panel_3.txt @@ -1,3 +1,3 @@ -╭───────────────────────────── test ───╮ -│ │ +╭───────────────────────────── test ───╮ +│ │ ╰──────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/centered_title_panel_4.txt b/test/txtfiles/centered_title_panel_4.txt index 0d1aab507..939539b05 100644 --- a/test/txtfiles/centered_title_panel_4.txt +++ b/test/txtfiles/centered_title_panel_4.txt @@ -1,3 +1,3 @@ -╭──── test ──────────────────────────────────────╮ -│ │ +╭──── test ──────────────────────────────────────╮ +│ │ ╰────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/centered_title_panel_5.txt b/test/txtfiles/centered_title_panel_5.txt index 651d030d3..379171d99 100644 --- a/test/txtfiles/centered_title_panel_5.txt +++ b/test/txtfiles/centered_title_panel_5.txt @@ -1,3 +1,3 @@ -╭───────────────────── test ─────────────────────╮ -│ │ +╭───────────────────── test ─────────────────────╮ +│ │ ╰────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/centered_title_panel_6.txt b/test/txtfiles/centered_title_panel_6.txt index aef3181f7..f25e170e5 100644 --- a/test/txtfiles/centered_title_panel_6.txt +++ b/test/txtfiles/centered_title_panel_6.txt @@ -1,3 +1,3 @@ -╭─────────────────────────────────────── test ───╮ -│ │ +╭─────────────────────────────────────── test ───╮ +│ │ ╰────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/compositor_2.txt b/test/txtfiles/compositor_2.txt index 96ed9c9c9..00826e844 100644 --- a/test/txtfiles/compositor_2.txt +++ b/test/txtfiles/compositor_2.txt @@ -1,16 +1,16 @@ ╲ ╲ ╲ ╲ ╲ ╲ ╭──────────╮ - ╲ ╲ ╲ ╲ ╲ ╲│ │ -╲ ╲ ╲ ╲ ╲ ╲ │ │ - ╲ ╲ ╲ ╲ ╲ ╲│ │ -╲ ╲ ╲ ╲ ╲ ╲ │ │ - ╲ ╲ ╲ ╲ ╲ ╲│ │ -╲ ╲ ╲ ╲ ╲ ╲ │ │ - ╲ ╲ ╲ ╲ ╲ ╲│ │ -╲ ╲ ╲ ╲ ╲ ╲ │ │ - ╲ ╲ ╲ ╲ ╲ ╲│ │ -╲ ╲ ╲ ╲ ╲ ╲ │ │ - ╲ ╲ ╲ ╲ ╲ ╲│ │ -╲ ╲ ╲ ╲ ╲ ╲ │ │ + ╲ ╲ ╲ ╲ ╲ ╲│ │ +╲ ╲ ╲ ╲ ╲ ╲ │ │ + ╲ ╲ ╲ ╲ ╲ ╲│ │ +╲ ╲ ╲ ╲ ╲ ╲ │ │ + ╲ ╲ ╲ ╲ ╲ ╲│ │ +╲ ╲ ╲ ╲ ╲ ╲ │ │ + ╲ ╲ ╲ ╲ ╲ ╲│ │ +╲ ╲ ╲ ╲ ╲ ╲ │ │ + ╲ ╲ ╲ ╲ ╲ ╲│ │ +╲ ╲ ╲ ╲ ╲ ╲ │ │ + ╲ ╲ ╲ ╲ ╲ ╲│ │ +╲ ╲ ╲ ╲ ╲ ╲ │ │  ╲ ╲ ╲ ╲ ╲ ╲╰──────────╯ ╲ ╲ ╲ ╲ ╲ ╲   ╲ ╲ ╲ ╲ ╲ ╲ diff --git a/test/txtfiles/compositor_4.txt b/test/txtfiles/compositor_4.txt index 07f89c5d2..3f2ac7ef7 100644 --- a/test/txtfiles/compositor_4.txt +++ b/test/txtfiles/compositor_4.txt @@ -1,32 +1,32 @@ ╭──────────────────╮ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ ╰──────────────────╯ ╭──────────╮ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ ╰──────────╯ diff --git a/test/txtfiles/exptree_expr_1.txt b/test/txtfiles/exptree_expr_1.txt index 9de3aa7f4..2b5e347a2 100644 --- a/test/txtfiles/exptree_expr_1.txt +++ b/test/txtfiles/exptree_expr_1.txt @@ -1,15 +1,16 @@ -╭─────────────────────────────────── 2x+3y+2 ──────────────────────────────────╮ -│ │ -│ 2x+3y+2 │ -│ ━━━━━━━━━ │ -│ │  │ -│ └── 2x+3y+2 (call: +) │ -│  ├── 2x (call: *) │ -│  │ ├── 2 │ -│  │ └── x │ -│  ├── 3y (call: *) │ -│  │ ├── 3 │ -│  │ └── y │ -│  └── 2 │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭─────────────────────────────────── 2x+3y+2 ──────────────────────────────────╮ +│ │ +│ 2x + 3y + 2 │ +│ ├─ 1 ⇒ + │ +│ ├─ 2 ⇒ 2x │ +│ │ ├─ 1 ⇒ * │ +│ │ ├─ 2 ⇒ 2 │ +│ │ └─ 3 ⇒ x │ +│ ├─ 3 ⇒ 3y │ +│ │ ├─ 1 ⇒ * │ +│ │ ├─ 2 ⇒ 3 │ +│ │ └─ 3 ⇒ y │ +│ └─ 4 ⇒ 2 │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/exptree_expr_2.txt b/test/txtfiles/exptree_expr_2.txt index 760d5c1da..d9137f926 100644 --- a/test/txtfiles/exptree_expr_2.txt +++ b/test/txtfiles/exptree_expr_2.txt @@ -1,16 +1,17 @@ -╭────────────────────────────────── 2x+3+2+2y ─────────────────────────────────╮ -│ │ -│ 2x+3+2+2y │ -│ ━━━━━━━━━━━ │ -│ │  │ -│ └── 2x+3+2+2y (call: +) │ -│  ├── 2x (call: *) │ -│  │ ├── 2 │ -│  │ └── x │ -│  ├── 3 │ -│  ├── 2 │ -│  └── 2y (call: *) │ -│   ├── 2 │ -│   └── y │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭────────────────────────────────── 2x+3+2+2y ─────────────────────────────────╮ +│ │ +│ 2x + 3 + 2 + 2y │ +│ ├─ 1 ⇒ + │ +│ ├─ 2 ⇒ 2x │ +│ │ ├─ 1 ⇒ * │ +│ │ ├─ 2 ⇒ 2 │ +│ │ └─ 3 ⇒ x │ +│ ├─ 3 ⇒ 3 │ +│ ├─ 4 ⇒ 2 │ +│ └─ 5 ⇒ 2y │ +│ ├─ 1 ⇒ * │ +│ ├─ 2 ⇒ 2 │ +│ └─ 3 ⇒ y │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/exptree_expr_3.txt b/test/txtfiles/exptree_expr_3.txt index 74ca21121..7f10218df 100644 --- a/test/txtfiles/exptree_expr_3.txt +++ b/test/txtfiles/exptree_expr_3.txt @@ -1,14 +1,15 @@ -╭────────────────────────────────── 2*x^(3+y) ─────────────────────────────────╮ -│ │ -│ 2*x^(3+y) │ -│ ━━━━━━━━━━━ │ -│ │  │ -│ └── 2*x^(3+y) (call: *) │ -│  ├── 2 │ -│  └── x^(3+y) (call: ^) │ -│   ├── x │ -│   └── 3+y (call: +) │ -│    ├── 3 │ -│    └── y │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭────────────────────────────────── 2*x^(3+y) ─────────────────────────────────╮ +│ │ +│ 2 * x ^ (3 + y) │ +│ ├─ 1 ⇒ * │ +│ ├─ 2 ⇒ 2 │ +│ └─ 3 ⇒ x ^ (3 + y) │ +│ ├─ 1 ⇒ ^ │ +│ ├─ 2 ⇒ x │ +│ └─ 3 ⇒ 3 + y │ +│ ├─ 1 ⇒ + │ +│ ├─ 2 ⇒ 3 │ +│ └─ 3 ⇒ y │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/exptree_expr_4.txt b/test/txtfiles/exptree_expr_4.txt index ccfa1cec6..044b0f375 100644 --- a/test/txtfiles/exptree_expr_4.txt +++ b/test/txtfiles/exptree_expr_4.txt @@ -1,16 +1,18 @@ -╭───────────────────────────────── (1+1)-2*x^2 ────────────────────────────────╮ -│ │ -│ (1+1)-2*x^2 │ -│ ━━━━━━━━━━━━━ │ -│ │  │ -│ └── (1+1)-2*x^2 (call: -) │ -│  ├── 1+1 (call: +) │ -│  │ ├── 1 │ -│  │ └── 1 │ -│  └── 2*x^2 (call: *) │ -│   ├── 2 │ -│   └── x^2 (call: ^) │ -│    ├── x │ -│    └── 2 │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭───────────────────────────────── (1+1)-2*x^2 ────────────────────────────────╮ +│ │ +│ (1 + 1) - 2 * x ^ 2 │ +│ ├─ 1 ⇒ - │ +│ ├─ 2 ⇒ 1 + 1 │ +│ │ ├─ 1 ⇒ + │ +│ │ ├─ 2 ⇒ 1 │ +│ │ └─ 3 ⇒ 1 │ +│ └─ 3 ⇒ 2 * x ^ 2 │ +│ ├─ 1 ⇒ * │ +│ ├─ 2 ⇒ 2 │ +│ └─ 3 ⇒ x ^ 2 │ +│ ├─ 1 ⇒ ^ │ +│ ├─ 2 ⇒ x │ +│ └─ 3 ⇒ 2 │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/exptree_expr_5.txt b/test/txtfiles/exptree_expr_5.txt index 10518fe74..23f2aeadb 100644 --- a/test/txtfiles/exptree_expr_5.txt +++ b/test/txtfiles/exptree_expr_5.txt @@ -1,10 +1,9 @@ -╭────────────────────────────────── mod(22,6) ─────────────────────────────────╮ -│ │ -│ mod(22,6) │ -│ ━━━━━━━━━━━ │ -│ │  │ -│ └── mod(22,6) (call: mod) │ -│  ├── 22 │ -│  └── 6 │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭────────────────────────────────── mod(22,6) ─────────────────────────────────╮ +│ │ +│ mod(22, 6) │ +│ ├─ 1 ⇒ mod │ +│ ├─ 2 ⇒ 22 │ +│ └─ 3 ⇒ 6 │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/exptree_expr_6.txt b/test/txtfiles/exptree_expr_6.txt index ef8e6012e..556f8f35a 100644 --- a/test/txtfiles/exptree_expr_6.txt +++ b/test/txtfiles/exptree_expr_6.txt @@ -1,18 +1,21 @@ -╭──────────────────────────────── 2*x^(3+y)+2z ────────────────────────────────╮ -│ │ -│ 2*x^(3+y)+2z │ -│ ━━━━━━━━━━━━━━ │ -│ │  │ -│ └── 2*x^(3+y)+2z (call: +) │ -│  ├── 2*x^(3+y) (call: *) │ -│  │ ├── 2 │ -│  │ └── x^(3+y) (call: ^) │ -│  │  ├── x │ -│  │  └── 3+y (call: +) │ -│  │   ├── 3 │ -│  │   └── y │ -│  └── 2z (call: *) │ -│   ├── 2 │ -│   └── z │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭──────────────────────────────── 2*x^(3+y)+2z ────────────────────────────────╮ +│ │ +│ 2 * x ^ (3 + y) + 2z │ +│ ├─ 1 ⇒ + │ +│ ├─ 2 ⇒ 2 * x ^ (3 + y) │ +│ │ ├─ 1 ⇒ * │ +│ │ ├─ 2 ⇒ 2 │ +│ │ └─ 3 ⇒ x ^ (3 + y) │ +│ │ ├─ 1 ⇒ ^ │ +│ │ ├─ 2 ⇒ x │ +│ │ └─ 3 ⇒ 3 + y │ +│ │ ├─ 1 ⇒ + │ +│ │ ├─ 2 ⇒ 3 │ +│ │ └─ 3 ⇒ y │ +│ └─ 3 ⇒ 2z │ +│ ├─ 1 ⇒ * │ +│ ├─ 2 ⇒ 2 │ +│ └─ 3 ⇒ z │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/exptree_expr_7.txt b/test/txtfiles/exptree_expr_7.txt index c20133378..2036df5b4 100644 --- a/test/txtfiles/exptree_expr_7.txt +++ b/test/txtfiles/exptree_expr_7.txt @@ -1,19 +1,23 @@ -╭──────────────────────────────── 2x+3*√(3*x^2) ───────────────────────────────╮ -│ │ -│ 2x+3*√(3*x^2) │ -│ ━━━━━━━━━━━━━━━ │ -│ │  │ -│ └── 2x+3*√(3*x^2) (call: +) │ -│  ├── 2x (call: *) │ -│  │ ├── 2 │ -│  │ └── x │ -│  └── 3*√(3*x^2) (call: *) │ -│   ├── 3 │ -│   └── √(3*x^2) (call: √) │ -│    └── 3*x^2 (call: *) │ -│     ├── 3 │ -│     └── x^2 (call: ^) │ -│      ├── x │ -│      └── 2 │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭──────────────────────────────── 2x+3*√(3*x^2) ───────────────────────────────╮ +│ │ +│ 2x + 3 * √(3 * x ^ 2) │ +│ ├─ 1 ⇒ + │ +│ ├─ 2 ⇒ 2x │ +│ │ ├─ 1 ⇒ * │ +│ │ ├─ 2 ⇒ 2 │ +│ │ └─ 3 ⇒ x │ +│ └─ 3 ⇒ 3 * √(3 * x ^ 2) │ +│ ├─ 1 ⇒ * │ +│ ├─ 2 ⇒ 3 │ +│ └─ 3 ⇒ √(3 * x ^ 2) │ +│ ├─ 1 ⇒ √ │ +│ └─ 2 ⇒ 3 * x ^ 2 │ +│ ├─ 1 ⇒ * │ +│ ├─ 2 ⇒ 3 │ +│ └─ 3 ⇒ x ^ 2 │ +│ ├─ 1 ⇒ ^ │ +│ ├─ 2 ⇒ x │ +│ └─ 3 ⇒ 2 │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/exptree_expr_8.txt b/test/txtfiles/exptree_expr_8.txt index 19c496813..49476be5a 100644 --- a/test/txtfiles/exptree_expr_8.txt +++ b/test/txtfiles/exptree_expr_8.txt @@ -1,10 +1,10 @@ -╭──────────────────────────── print(lstrip("test")) ───────────────────────────╮ -│ │ -│ print(lstrip("test")) │ -│ ━━━━━━━━━━━━━━━━━━━━━━━ │ -│ │  │ -│ └── print(lstrip("test")) (call: print) │ -│  └── lstrip("test") (call: lstrip) │ -│   └── test │ -│ │ -╰────────────────────────────────────────────────────────────────── inspect ───╯ +╭──────────────────────────── print(lstrip("test")) ───────────────────────────╮ +│ │ +│ print(lstrip("test")) │ +│ ├─ 1 ⇒ print │ +│ └─ 2 ⇒ lstrip("test") │ +│ ├─ 1 ⇒ lstrip │ +│ └─ 2 ⇒ test │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────── inspect ───╯ diff --git a/test/txtfiles/link_panel_1_1_1.txt b/test/txtfiles/link_panel_1_1_1.txt index 5d8d4568b..287daae9a 100644 --- a/test/txtfiles/link_panel_1_1_1.txt +++ b/test/txtfiles/link_panel_1_1_1.txt @@ -1,3 +1,3 @@ ╭─────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ ╰─────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_1_2.txt b/test/txtfiles/link_panel_1_1_2.txt index 83581faad..bcaddf598 100644 --- a/test/txtfiles/link_panel_1_1_2.txt +++ b/test/txtfiles/link_panel_1_1_2.txt @@ -1,4 +1,4 @@ ╭─────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ -│ abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ +│ abcd │ ╰─────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_1_3.txt b/test/txtfiles/link_panel_1_1_3.txt index 7273b73a8..ab3d10a0d 100644 --- a/test/txtfiles/link_panel_1_1_3.txt +++ b/test/txtfiles/link_panel_1_1_3.txt @@ -1,3 +1,3 @@ ╭─────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\abcd │ ╰─────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_1_4.txt b/test/txtfiles/link_panel_1_1_4.txt index 8b73ae572..6ac2545bf 100644 --- a/test/txtfiles/link_panel_1_1_4.txt +++ b/test/txtfiles/link_panel_1_1_4.txt @@ -1,3 +1,3 @@ ╭────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ ╰────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_1_5.txt b/test/txtfiles/link_panel_1_1_5.txt index 952079ec0..914b0e99e 100644 --- a/test/txtfiles/link_panel_1_1_5.txt +++ b/test/txtfiles/link_panel_1_1_5.txt @@ -1,6 +1,6 @@ ╭──────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ -│ ╭────────────────────────────────────────────────╮ │ -│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ │ -│ ╰────────────────────────────────────────────────╯ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ +│ ╭────────────────────────────────────────────────╮ │ +│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ │ +│ ╰────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_2_1.txt b/test/txtfiles/link_panel_1_2_1.txt index 54ffcbd7a..96a700620 100644 --- a/test/txtfiles/link_panel_1_2_1.txt +++ b/test/txtfiles/link_panel_1_2_1.txt @@ -1,3 +1,3 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl ]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl ]8;;\ │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_2_2.txt b/test/txtfiles/link_panel_1_2_2.txt index 69804995b..8d6421869 100644 --- a/test/txtfiles/link_panel_1_2_2.txt +++ b/test/txtfiles/link_panel_1_2_2.txt @@ -1,4 +1,4 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ -│ abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ +│ abcd │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_2_3.txt b/test/txtfiles/link_panel_1_2_3.txt index 09fc9f8f0..6d42ae7c9 100644 --- a/test/txtfiles/link_panel_1_2_3.txt +++ b/test/txtfiles/link_panel_1_2_3.txt @@ -1,3 +1,3 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\abcd │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_2_4.txt b/test/txtfiles/link_panel_1_2_4.txt index 8b73ae572..6ac2545bf 100644 --- a/test/txtfiles/link_panel_1_2_4.txt +++ b/test/txtfiles/link_panel_1_2_4.txt @@ -1,3 +1,3 @@ ╭────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ ╰────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_1_2_5.txt b/test/txtfiles/link_panel_1_2_5.txt index 4c8561368..fbc0109ab 100644 --- a/test/txtfiles/link_panel_1_2_5.txt +++ b/test/txtfiles/link_panel_1_2_5.txt @@ -1,6 +1,6 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ -│ ╭────────────────────────────────────────────────╮ │ -│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ │ -│ ╰────────────────────────────────────────────────╯ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ +│ ╭────────────────────────────────────────────────╮ │ +│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl\...Term.jl/src/_tables.jl]8;;\ │ │ +│ ╰────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_1_1.txt b/test/txtfiles/link_panel_2_1_1.txt index 028e1683b..695d054b0 100644 --- a/test/txtfiles/link_panel_2_1_1.txt +++ b/test/txtfiles/link_panel_2_1_1.txt @@ -1,3 +1,3 @@ ╭─────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ ╰─────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_1_2.txt b/test/txtfiles/link_panel_2_1_2.txt index b63b93b07..af1b3d71d 100644 --- a/test/txtfiles/link_panel_2_1_2.txt +++ b/test/txtfiles/link_panel_2_1_2.txt @@ -1,4 +1,4 @@ ╭─────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ abcd │ ╰─────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_1_3.txt b/test/txtfiles/link_panel_2_1_3.txt index b6b3785de..7dabf3024 100644 --- a/test/txtfiles/link_panel_2_1_3.txt +++ b/test/txtfiles/link_panel_2_1_3.txt @@ -1,3 +1,3 @@ ╭─────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ ╰─────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_1_4.txt b/test/txtfiles/link_panel_2_1_4.txt index 0fc0cc462..40b283a71 100644 --- a/test/txtfiles/link_panel_2_1_4.txt +++ b/test/txtfiles/link_panel_2_1_4.txt @@ -1,3 +1,3 @@ ╭────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ ╰────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_1_5.txt b/test/txtfiles/link_panel_2_1_5.txt index 0f23f3d6f..0368aefee 100644 --- a/test/txtfiles/link_panel_2_1_5.txt +++ b/test/txtfiles/link_panel_2_1_5.txt @@ -1,6 +1,6 @@ ╭──────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ ╭────────────────────────────────────────────────╮ │ -│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ -│ ╰────────────────────────────────────────────────╯ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ╭────────────────────────────────────────────────╮ │ +│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ +│ ╰────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_2_1.txt b/test/txtfiles/link_panel_2_2_1.txt index ec5f960d2..18c4b3a89 100644 --- a/test/txtfiles/link_panel_2_2_1.txt +++ b/test/txtfiles/link_panel_2_2_1.txt @@ -1,3 +1,3 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234 ]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234 ]8;;\ │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_2_2.txt b/test/txtfiles/link_panel_2_2_2.txt index 8acee6bc0..d21f761fa 100644 --- a/test/txtfiles/link_panel_2_2_2.txt +++ b/test/txtfiles/link_panel_2_2_2.txt @@ -1,4 +1,4 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ abcd │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_2_3.txt b/test/txtfiles/link_panel_2_2_3.txt index d7b845526..5284f2b2f 100644 --- a/test/txtfiles/link_panel_2_2_3.txt +++ b/test/txtfiles/link_panel_2_2_3.txt @@ -1,3 +1,3 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_2_4.txt b/test/txtfiles/link_panel_2_2_4.txt index 0fc0cc462..40b283a71 100644 --- a/test/txtfiles/link_panel_2_2_4.txt +++ b/test/txtfiles/link_panel_2_2_4.txt @@ -1,3 +1,3 @@ ╭────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ ╰────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_2_2_5.txt b/test/txtfiles/link_panel_2_2_5.txt index 2d6fc5cd9..72510730d 100644 --- a/test/txtfiles/link_panel_2_2_5.txt +++ b/test/txtfiles/link_panel_2_2_5.txt @@ -1,6 +1,6 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ ╭────────────────────────────────────────────────╮ │ -│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ -│ ╰────────────────────────────────────────────────╯ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ╭────────────────────────────────────────────────╮ │ +│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ +│ ╰────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_1_1.txt b/test/txtfiles/link_panel_3_1_1.txt index 00d39cf4b..f0847444c 100644 --- a/test/txtfiles/link_panel_3_1_1.txt +++ b/test/txtfiles/link_panel_3_1_1.txt @@ -1,3 +1,3 @@ ╭─────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ ╰─────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_1_2.txt b/test/txtfiles/link_panel_3_1_2.txt index cc3250f63..56e45f7cb 100644 --- a/test/txtfiles/link_panel_3_1_2.txt +++ b/test/txtfiles/link_panel_3_1_2.txt @@ -1,4 +1,4 @@ ╭─────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ abcd │ ╰─────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_1_3.txt b/test/txtfiles/link_panel_3_1_3.txt index 07a5c6289..2643a31f2 100644 --- a/test/txtfiles/link_panel_3_1_3.txt +++ b/test/txtfiles/link_panel_3_1_3.txt @@ -1,3 +1,3 @@ ╭─────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ ╰─────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_1_4.txt b/test/txtfiles/link_panel_3_1_4.txt index 35ba9093c..da77d0d9c 100644 --- a/test/txtfiles/link_panel_3_1_4.txt +++ b/test/txtfiles/link_panel_3_1_4.txt @@ -1,3 +1,3 @@ ╭────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ ╰────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_1_5.txt b/test/txtfiles/link_panel_3_1_5.txt index ebaf0da5c..0c8f1d100 100644 --- a/test/txtfiles/link_panel_3_1_5.txt +++ b/test/txtfiles/link_panel_3_1_5.txt @@ -1,6 +1,6 @@ ╭──────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ ╭────────────────────────────────────────────────╮ │ -│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ -│ ╰────────────────────────────────────────────────╯ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ╭────────────────────────────────────────────────╮ │ +│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ +│ ╰────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_2_1.txt b/test/txtfiles/link_panel_3_2_1.txt index 15d556534..95e9da211 100644 --- a/test/txtfiles/link_panel_3_2_1.txt +++ b/test/txtfiles/link_panel_3_2_1.txt @@ -1,3 +1,3 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234 ]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234 ]8;;\ │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_2_2.txt b/test/txtfiles/link_panel_3_2_2.txt index 503665b0a..4b22d8615 100644 --- a/test/txtfiles/link_panel_3_2_2.txt +++ b/test/txtfiles/link_panel_3_2_2.txt @@ -1,4 +1,4 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ abcd │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_2_3.txt b/test/txtfiles/link_panel_3_2_3.txt index d4d2c07bd..df6a840b9 100644 --- a/test/txtfiles/link_panel_3_2_3.txt +++ b/test/txtfiles/link_panel_3_2_3.txt @@ -1,3 +1,3 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\abcd │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_2_4.txt b/test/txtfiles/link_panel_3_2_4.txt index 35ba9093c..da77d0d9c 100644 --- a/test/txtfiles/link_panel_3_2_4.txt +++ b/test/txtfiles/link_panel_3_2_4.txt @@ -1,3 +1,3 @@ ╭────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ ╰────────────────────────────────────────────────╯ diff --git a/test/txtfiles/link_panel_3_2_5.txt b/test/txtfiles/link_panel_3_2_5.txt index d6c64be16..86471b644 100644 --- a/test/txtfiles/link_panel_3_2_5.txt +++ b/test/txtfiles/link_panel_3_2_5.txt @@ -1,6 +1,6 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ -│ ╭────────────────────────────────────────────────╮ │ -│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ -│ ╰────────────────────────────────────────────────╯ │ +│ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ +│ ╭────────────────────────────────────────────────╮ │ +│ │ ]8;;/Users/federicoclaudi/Documents/Github/Term.jl/src/_tables.jl#234\...Term.jl/src/_tables.jl 234]8;;\ │ │ +│ ╰────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ diff --git a/test/txtfiles/markdown_2.txt b/test/txtfiles/markdown_2.txt index 78ac30592..93f820381 100644 --- a/test/txtfiles/markdown_2.txt +++ b/test/txtfiles/markdown_2.txt @@ -1,5 +1,5 @@ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -┃ Markdown rendering in Term.jl ┃ +┃ Markdown rendering in Term.jl ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ {bold #42A5F5 underline}twp{/bold #42A5F5 underline} diff --git a/test/txtfiles/markdown_3.txt b/test/txtfiles/markdown_3.txt index 9b4f1e557..20eec8e95 100644 --- a/test/txtfiles/markdown_3.txt +++ b/test/txtfiles/markdown_3.txt @@ -14,11 +14,11 @@ and footnotes {#9aacdb}[1]{/#9aacdb} for your content {#9aacdb}[named]{/#9aacdb} And, of course, you can show some code too: - ┌──────────────────────────────────────────────┐ - │ function say_hi(x)  │ - │  print("Hellow World")  │ - │ end  │ - └──────────────────────────────────── julia ───┘ + ┌──────────────────────────────────────────────┐ + │ function say_hi(x)  │ + │  print("Hellow World")  │ + │ end  │ + └──────────────────────────────────── julia ───┘ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -32,22 +32,22 @@ You can use "quotes" to highlight a section: but if you really need to grab someone's attention, use admonitions: - ╭──── Note ────────────────────────────────────────╮ - │ You can use different levels │ + ╭──── Note ────────────────────────────────────────╮ + │ You can use different levels │ ╰──────────────────────────────────────────────────╯ - ╭──── Warning ─────────────────────────────────────╮ - │ to send different messages │ + ╭──── Warning ─────────────────────────────────────╮ + │ to send different messages │ ╰──────────────────────────────────────────────────╯ - ╭──── Danger ──────────────────────────────────────╮ - │ to your reader │ + ╭──── Danger ──────────────────────────────────────╮ + │ to your reader │ ╰──────────────────────────────────────────────────╯ - ╭──── Wow! ────────────────────────────────────────╮ - │ Turns out that admonitions can be pretty │ - │ useful! │ - │ What will you use them for? │ + ╭──── Wow! ────────────────────────────────────────╮ + │ Turns out that admonitions can be pretty │ + │ useful! │ + │ What will you use them for? │ ╰──────────────────────────────────────────────────╯ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -69,12 +69,12 @@ and ordered lists too: {bold} 3. {/bold}item three - ╭──── Tables ──────────────────────────────────────╮ - │ You can use the Markdown table syntax (https: │ - │ //www │ - │ .markdownguide.org/extended-sy │ - │ ntax/#tables) to insert tables - Term.jl will │ - │ convert them to Table object! │ + ╭──── Tables ──────────────────────────────────────╮ + │ You can use the Markdown table syntax (https: │ + │ //www │ + │ .markdownguide.org/extended-sy │ + │ ntax/#tables) to insert tables - Term.jl will │ + │ convert them to Table object! │ ╰──────────────────────────────────────────────────╯ ╭───────────┬──────────────┬────────────╮ diff --git a/test/txtfiles/mts_repr.txt b/test/txtfiles/mts_repr.txt new file mode 100644 index 000000000..e9c684bfb --- /dev/null +++ b/test/txtfiles/mts_repr.txt @@ -0,0 +1,10 @@ +╭─────────────────────────────────────────────────────────────╮ +│  x::String  aa aaaa aaaa aaaa aaaa aaaa aaaa aaaa...   │ +│  y::Array   [0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0...   │ +│  z::Int64   3   │ +│    ╭─────────────────────────────────────────...  │ +│  a::Panel  │...   │ +│    ╰─────────────────────────────────────────...  │ +│  c::String  b b bb b bb b bb b bb b bb b bb b bb...   │ +│   │ +╰─────────────────────────────────────────── MyTestStruct3 ───╯ diff --git a/test/txtfiles/panels_constructors_1.txt b/test/txtfiles/panels_constructors_1.txt index 144a96535..0f7f18334 100644 --- a/test/txtfiles/panels_constructors_1.txt +++ b/test/txtfiles/panels_constructors_1.txt @@ -1,8 +1,8 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ╭───╮ │ -│ │ │ │ -│ ╰───╯ │ -│ ╭──────╮ │ -│ │ │ │ -│ ╰──────╯ │ +│ ╭───╮ │ +│ │ │ │ +│ ╰───╯ │ +│ ╭──────╮ │ +│ │ │ │ +│ ╰──────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/panels_constructors_2.txt b/test/txtfiles/panels_constructors_2.txt index 144a96535..0f7f18334 100644 --- a/test/txtfiles/panels_constructors_2.txt +++ b/test/txtfiles/panels_constructors_2.txt @@ -1,8 +1,8 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ╭───╮ │ -│ │ │ │ -│ ╰───╯ │ -│ ╭──────╮ │ -│ │ │ │ -│ ╰──────╯ │ +│ ╭───╮ │ +│ │ │ │ +│ ╰───╯ │ +│ ╭──────╮ │ +│ │ │ │ +│ ╰──────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/panels_layout_macro.txt b/test/txtfiles/panels_layout_macro.txt index a3c679943..26aca855d 100644 --- a/test/txtfiles/panels_layout_macro.txt +++ b/test/txtfiles/panels_layout_macro.txt @@ -1,20 +1,20 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ inner │ │ -│ │ ╭──────────────────────────────────────────────────────────────────╮ │ │ -│ │ │ out │ │ │ -│ │ │ ╭────────────────────────────────────────────────────────────╮ │ │ │ -│ │ │ │ deep │ │ │ │ -│ │ │ ╰────────────────────────────────────────────────────────────╯ │ │ │ -│ │ ╰──────────────────────────────────────────────────────────────────╯ │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 │ │ -│ │ inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 │ │ -│ │ inner2 inner2 inner2 inner2 inner2 inner2 inner2 │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ test │ -│ adasdasda │ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│  ... content omitted ...  │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ inner │ │ +│ │ ╭──────────────────────────────────────────────────────────────────╮ │ │ +│ │ │ out │ │ │ +│ │ │ ╭────────────────────────────────────────────────────────────╮ │ │ │ +│ │ │ │ deep │ │ │ │ +│ │ │ ╰────────────────────────────────────────────────────────────╯ │ │ │ +│ │ ╰──────────────────────────────────────────────────────────────────╯ │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 │ │ +│ │ inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 inner2 │ │ +│ │ inner2 inner2 inner2 inner2 inner2 inner2 inner2 │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ test │ +│ adasdasda │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│  ... content omitted ...  │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/panels_layout_macro2.txt b/test/txtfiles/panels_layout_macro2.txt index ca8d029e9..4417cf28f 100644 --- a/test/txtfiles/panels_layout_macro2.txt +++ b/test/txtfiles/panels_layout_macro2.txt @@ -1,20 +1,20 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ ╭──────────────────────────────────────────────────────────────────╮ │ │ -│ │ │ │ │ │ -│ │ ╰──────────────────────────────────────────────────────────────────╯ │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ ╭──────────────────────────────────────────────────────────────────╮ │ │ -│ │ │ red │ │ │ -│ │ ╰──────────────────────────────────────────────────────────────────╯ │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ done │ -│ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ ╭──────────────────────────────────────────────────────────────────╮ │ │ +│ │ │ │ │ │ +│ │ ╰──────────────────────────────────────────────────────────────────╯ │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ ╭──────────────────────────────────────────────────────────────────╮ │ │ +│ │ │ red │ │ │ +│ │ ╰──────────────────────────────────────────────────────────────────╯ │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ done │ +│ │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/panels_layout_macro3.txt b/test/txtfiles/panels_layout_macro3.txt index 273952ab7..6eadef609 100644 --- a/test/txtfiles/panels_layout_macro3.txt +++ b/test/txtfiles/panels_layout_macro3.txt @@ -1,3 +1,3 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ │ +│ │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/panels_layout_macro4.txt b/test/txtfiles/panels_layout_macro4.txt index 2763250bc..506c830e7 100644 --- a/test/txtfiles/panels_layout_macro4.txt +++ b/test/txtfiles/panels_layout_macro4.txt @@ -1,5 +1,5 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/panels_layout_macro5.txt b/test/txtfiles/panels_layout_macro5.txt index d9e2ab4e0..ecb0a8f43 100644 --- a/test/txtfiles/panels_layout_macro5.txt +++ b/test/txtfiles/panels_layout_macro5.txt @@ -1,8 +1,8 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ a │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ b │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ a │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ b │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/panels_layout_macro6.txt b/test/txtfiles/panels_layout_macro6.txt index 6388f9736..1c3f7e631 100644 --- a/test/txtfiles/panels_layout_macro6.txt +++ b/test/txtfiles/panels_layout_macro6.txt @@ -1,8 +1,8 @@ ╭──────────────────────────────────────────────────────────────────────────────╮ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ a │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ -│ ╭────────────────────────────────────────────────────────────────────────╮ │ -│ │ b │ │ -│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ a │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ +│ ╭────────────────────────────────────────────────────────────────────────╮ │ +│ │ b │ │ +│ ╰────────────────────────────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/rend_text_shape_i.txt b/test/txtfiles/rend_text_shape_i.txt deleted file mode 100644 index 832b0987d..000000000 --- a/test/txtfiles/rend_text_shape_i.txt +++ /dev/null @@ -1,8 +0,0 @@ -Lorem ipsum dolor sit amet, consectetur adipiscing elit, -sed do eiusmod tempor incididunt ut labore et dolore magna -aliqua. Ut enim ad minim veniam, quis nostrud exercitation -ullamco laboris nisi ut aliquip ex ea commodo consequat. -Duis aute irure dolor in reprehenderit in voluptate velit -esse cillum dolore eu fugiat nulla pariatur. Excepteur -sint occaecat cupidatat non proident, sunt in culpa qui -officia deserunt mollit anim id est laborum. \ No newline at end of file diff --git a/test/txtfiles/repr_T_struct.txt b/test/txtfiles/repr_T_struct.txt index 2c5f3f344..0b17f7736 100644 --- a/test/txtfiles/repr_T_struct.txt +++ b/test/txtfiles/repr_T_struct.txt @@ -1,3 +1,3 @@ ╭──────────╮ -│ T()::T │ -╰──── T ───╯ +│ T()::T │ +╰──── T ───╯ diff --git a/test/txtfiles/repr_rocket.txt b/test/txtfiles/repr_rocket.txt index 745f453e4..bbe136fff 100644 --- a/test/txtfiles/repr_rocket.txt +++ b/test/txtfiles/repr_rocket.txt @@ -1,6 +1,7 @@ -╭────────────────────────────────╮ -│ width::Int64│ 10 │ -│ height::Int64│ 50 │ -│ mass::Float64│ 5000.0 │ -│ manufacturer::String│ NASA │ -╰───────────────────── Rocket ───╯ +╭─────────────────────────────────╮ +│   width::Int64   10   │ +│   height::Int64   50   │ +│   mass::Float64  5000.0  │ +│  manufacturer::String  NASA   │ +│   │ +╰────────────────────── Rocket ───╯ diff --git a/test/txtfiles/repr_rocket_2.txt b/test/txtfiles/repr_rocket_2.txt index 567d576fd..ae4fbd500 100644 --- a/test/txtfiles/repr_rocket_2.txt +++ b/test/txtfiles/repr_rocket_2.txt @@ -1,6 +1,7 @@ -╭─────────────────────────────╮ -│ width::Int64│ 1 │ -│ height::Int64│ 1 │ -│ mass::Float64│ 1.0 │ -│ manufacturer::String│ me │ -╰───────────────── Rocket2 ───╯ +╭──────────────────────────────╮ +│   width::Int64   1   │ +│   height::Int64   1   │ +│   mass::Float64  1.0  │ +│  manufacturer::String me   │ +│   │ +╰────────────────── Rocket2 ───╯ diff --git a/test/txtfiles/repr_rocket_2_show.txt b/test/txtfiles/repr_rocket_2_show.txt index 6a3e87486..41fc5c421 100644 --- a/test/txtfiles/repr_rocket_2_show.txt +++ b/test/txtfiles/repr_rocket_2_show.txt @@ -1,11 +1,11 @@ ╭─────────────────────────────────────────────────────────────────────────╮ - │ │ - │ Rocket2 <: Any │ - │ │ width ::Int64 │ - │ │ height ::Int64 │ - │ │ mass ::Float64 │ - │ │manufacturer ::String │ - │ │ + │ │ + │ Rocket2 <: Any │ + │ │ width ::Int64 │ + │ │ height ::Int64 │ + │ │ mass ::Float64 │ + │ │manufacturer ::String │ + │ │ ╰─────────────────────────────────────────────────────────────────────────╯ -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Docstring ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Docstring ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ docs \ No newline at end of file diff --git a/test/txtfiles/repr_rocket_struct.txt b/test/txtfiles/repr_rocket_struct.txt index e0d51f8eb..2c10eb827 100644 --- a/test/txtfiles/repr_rocket_struct.txt +++ b/test/txtfiles/repr_rocket_struct.txt @@ -1,30 +1,30 @@ ╭─────────────────────────────────────────────────────────────────────────╮ - │ │ - │ Rocket <: Any │ - │ │ width ::Int64 │ - │ │ height ::Int64 │ - │ │ mass ::Float64 │ - │ │manufacturer ::String │ - │ │ + │ │ + │ Rocket <: Any │ + │ │ width ::Int64 │ + │ │ height ::Int64 │ + │ │ mass ::Float64 │ + │ │manufacturer ::String │ + │ │ ╰─────────────────────────────────────────────────────────────────────────╯ -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Docstring ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Docstring ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ No documentation found. ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -┃ Summary ┃ +┃ Summary ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ┌──────────────────────────────────────────────────────────────────┐ - │ struct Rocket  │ - └──────────────────────────────────────────────────────────────────┘ + ┌──────────────────────────────────────────────────────────────────┐ + │ struct Rocket  │ + └──────────────────────────────────────────────────────────────────┘ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -┃ Fields ┃ +┃ Fields ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ┌──────────────────────────────────────────────────────────────────┐ - │ width :: Int64  │ - │ height :: Int64  │ - │ mass :: Float64  │ - │ manufacturer :: String  │ - └──────────────────────────────────────────────────────────────────┘ \ No newline at end of file + ┌──────────────────────────────────────────────────────────────────┐ + │ width :: Int64  │ + │ height :: Int64  │ + │ mass :: Float64  │ + │ manufacturer :: String  │ + └──────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/reshaped_rend_with_markup_1.txt b/test/txtfiles/reshaped_rend_with_markup_1.txt index 2b2772594..210237ad4 100644 --- a/test/txtfiles/reshaped_rend_with_markup_1.txt +++ b/test/txtfiles/reshaped_rend_with_markup_1.txt @@ -1,7 +1,7 @@ ╭────────────────────────────╮ -│ dasda asda dadasdaaadas │ -│ daddad asd ad ad ad │ -│ asdadadada ad as sad │ -│ ad adaad adas sd ads │ -│  │ +│ dasda asda dadasdaaadas │ +│ daddad asd ad ad ad │ +│ asdadadada ad as sad │ +│ ad adaad adas sd ads │ +│  │ ╰────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/reshaped_rend_with_markup_2.txt b/test/txtfiles/reshaped_rend_with_markup_2.txt index 2b2772594..210237ad4 100644 --- a/test/txtfiles/reshaped_rend_with_markup_2.txt +++ b/test/txtfiles/reshaped_rend_with_markup_2.txt @@ -1,7 +1,7 @@ ╭────────────────────────────╮ -│ dasda asda dadasdaaadas │ -│ daddad asd ad ad ad │ -│ asdadadada ad as sad │ -│ ad adaad adas sd ads │ -│  │ +│ dasda asda dadasdaaadas │ +│ daddad asd ad ad ad │ +│ asdadadada ad as sad │ +│ ad adaad adas sd ads │ +│  │ ╰────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/reshaped_rend_with_markup_3.txt b/test/txtfiles/reshaped_rend_with_markup_3.txt index 9fe460c93..27fb7e3b0 100644 --- a/test/txtfiles/reshaped_rend_with_markup_3.txt +++ b/test/txtfiles/reshaped_rend_with_markup_3.txt @@ -1,12 +1,12 @@ ╭────────────────────────────╮ -│ dasda asda dadasdaaadas │ -│ daddad asd ad ad ad │ -│ asdadadada ad as sad │ -│ ad adaad adas sd ads │ -│  NOW SIMPLE  adasd │ -│ aads a asd ads a dasiud │ -│ h asjdnasdiuasda  │ -│ asdnaisudnadaiuda │ -│ sjduiabdiabd aduas │ -│  │ +│ dasda asda dadasdaaadas │ +│ daddad asd ad ad ad │ +│ asdadadada ad as sad │ +│ ad adaad adas sd ads │ +│  NOW SIMPLE  adasd │ +│ aads a asd ads a dasiud │ +│ h asjdnasdiuasda  │ +│ asdnaisudnadaiuda │ +│ sjduiabdiabd aduas │ +│  │ ╰────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/reshaped_rend_with_markup_4.txt b/test/txtfiles/reshaped_rend_with_markup_4.txt index 9fe460c93..27fb7e3b0 100644 --- a/test/txtfiles/reshaped_rend_with_markup_4.txt +++ b/test/txtfiles/reshaped_rend_with_markup_4.txt @@ -1,12 +1,12 @@ ╭────────────────────────────╮ -│ dasda asda dadasdaaadas │ -│ daddad asd ad ad ad │ -│ asdadadada ad as sad │ -│ ad adaad adas sd ads │ -│  NOW SIMPLE  adasd │ -│ aads a asd ads a dasiud │ -│ h asjdnasdiuasda  │ -│ asdnaisudnadaiuda │ -│ sjduiabdiabd aduas │ -│  │ +│ dasda asda dadasdaaadas │ +│ daddad asd ad ad ad │ +│ asdadadada ad as sad │ +│ ad adaad adas sd ads │ +│  NOW SIMPLE  adasd │ +│ aads a asd ads a dasiud │ +│ h asjdnasdiuasda  │ +│ asdnaisudnadaiuda │ +│ sjduiabdiabd aduas │ +│  │ ╰────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/reshaped_rend_with_markup_5.txt b/test/txtfiles/reshaped_rend_with_markup_5.txt index 751eb908f..8cd71405f 100644 --- a/test/txtfiles/reshaped_rend_with_markup_5.txt +++ b/test/txtfiles/reshaped_rend_with_markup_5.txt @@ -1,12 +1,12 @@ ╭────────────────────────────╮ -│ dasda asda dadasdaaadas │ -│ daddad asd ad ad ad │ -│ asdadadada ad as sad │ -│ ad adaad adas sd ads │ -│  NOW SIMPLE  adasd │ -│ aads a asd ads a dasiud │ -│ h asjdnasdiuasda  │ -│ asdnaisudnadaiuda │ -│ sjduiabdiabd aduas │ -│  │ +│ dasda asda dadasdaaadas │ +│ daddad asd ad ad ad │ +│ asdadadada ad as sad │ +│ ad adaad adas sd ads │ +│  NOW SIMPLE  adasd │ +│ aads a asd ads a dasiud │ +│ h asjdnasdiuasda  │ +│ asdnaisudnadaiuda │ +│ sjduiabdiabd aduas │ +│  │ ╰────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/reshaped_rend_with_markup_6.txt b/test/txtfiles/reshaped_rend_with_markup_6.txt index 751eb908f..8cd71405f 100644 --- a/test/txtfiles/reshaped_rend_with_markup_6.txt +++ b/test/txtfiles/reshaped_rend_with_markup_6.txt @@ -1,12 +1,12 @@ ╭────────────────────────────╮ -│ dasda asda dadasdaaadas │ -│ daddad asd ad ad ad │ -│ asdadadada ad as sad │ -│ ad adaad adas sd ads │ -│  NOW SIMPLE  adasd │ -│ aads a asd ads a dasiud │ -│ h asjdnasdiuasda  │ -│ asdnaisudnadaiuda │ -│ sjduiabdiabd aduas │ -│  │ +│ dasda asda dadasdaaadas │ +│ daddad asd ad ad ad │ +│ asdadadada ad as sad │ +│ ad adaad adas sd ads │ +│  NOW SIMPLE  adasd │ +│ aads a asd ads a dasiud │ +│ h asjdnasdiuasda  │ +│ asdnaisudnadaiuda │ +│ sjduiabdiabd aduas │ +│  │ ╰────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/reshaped_text_16.txt b/test/txtfiles/reshaped_text_16.txt deleted file mode 100644 index d7a13229b..000000000 --- a/test/txtfiles/reshaped_text_16.txt +++ /dev/null @@ -1,18 +0,0 @@ -Lorem ipsum {bold}dolor sit{/bold} amet, -consectetur adipiscing elit, -ed do e{red}iusmod tempor incididunt{/red} -ut {bold}labore et {underline}dolore{/underline} magna aliqua.{/bold} -{bold}{/bold} Ut enim ad minim -veniam, quis{green} nostrud exercitation{/green} -{green} {on_black}ullamco laboris nisi ut aliquip{/on_black}{/green} -{green}{on_black}ex {/on_black}{/green} -ea commodo consequat.{blue} Duis aute{/blue} -{blue}irure dolor in{/blue} reprehenderit - -in voluptate velit{/green} esse {italic}cillum{/italic} -{italic}dolore{/italic}{red} eu{/red}{italic green} fugiat {/italic green}nulla -pariatur. Excepteur{red} sint{/red}{blue} occaecat{/blue} -{blue} cupidatat {/blue}non proident, -sunt in culpa qui {italic}officia{/italic} deserun -t mollit anim -id est laborum. \ No newline at end of file diff --git a/test/txtfiles/reshaped_text_17.txt b/test/txtfiles/reshaped_text_17.txt deleted file mode 100644 index 68c4a56e3..000000000 --- a/test/txtfiles/reshaped_text_17.txt +++ /dev/null @@ -1,15 +0,0 @@ -Term.jl is a {#9558B2}Julia{/#9558B2} package for -creating styled terminal outputs. - - -Term provides a simple {italic green4 bold}markup{/italic green4 bold} -{italic green4 bold}language{/italic green4 bold} to add {bold bright_blue}color{/bold bright_blue} and {bold underline}styles{/bold underline} -to your text. -More complicated text layout -can be created using {red}"Renderable"{/red} -{red}{/red} objects such -as {red}"Panel"{/red} and {red}"TextBox"{/red}. -These can also be nested and -stacked to create {italic pink3}fancy{/italic pink3} and -{underline}informative{/underline} terminal ouputs -for your Julia code \ No newline at end of file diff --git a/test/txtfiles/reshaped_text_markuo_1.txt b/test/txtfiles/reshaped_text_markuo_1.txt deleted file mode 100644 index 107e4cc2f..000000000 --- a/test/txtfiles/reshaped_text_markuo_1.txt +++ /dev/null @@ -1,4 +0,0 @@ -{red}dasda asda dadasda{green}aadasdad{/green}dad{/red} -{red}asd ad ad ad asdad{bold}adada ad{/red} -{red}{bold}as sad ad ada{/red}ad adas sd ads{/bold} -{bold}{/bold} \ No newline at end of file diff --git a/test/txtfiles/reshaped_text_markuo_2.txt b/test/txtfiles/reshaped_text_markuo_2.txt deleted file mode 100644 index 107e4cc2f..000000000 --- a/test/txtfiles/reshaped_text_markuo_2.txt +++ /dev/null @@ -1,4 +0,0 @@ -{red}dasda asda dadasda{green}aadasdad{/green}dad{/red} -{red}asd ad ad ad asdad{bold}adada ad{/red} -{red}{bold}as sad ad ada{/red}ad adas sd ads{/bold} -{bold}{/bold} \ No newline at end of file diff --git a/test/txtfiles/reshaped_text_markuo_3.txt b/test/txtfiles/reshaped_text_markuo_3.txt deleted file mode 100644 index aa40a0310..000000000 --- a/test/txtfiles/reshaped_text_markuo_3.txt +++ /dev/null @@ -1,7 +0,0 @@ -{red}dasda asda dadasda{green}aa{/red} -{red}{green}dasdad{/green}dad{/red} -{red}asd ad ad ad asdad{bold}ad{/red} -{red}{bold}ada ad{/red}{/bold} -{red}{bold}as sad ad ada{/red}ad{/bold} -{bold}adas sd ads{/bold} -{bold}{/bold} \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_1_1.txt b/test/txtfiles/single_widghet_app_1_1.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_1.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_1_1_help.txt b/test/txtfiles/single_widghet_app_1_1_help.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_1_help.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_1_1_nohelp.txt b/test/txtfiles/single_widghet_app_1_1_nohelp.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_1_nohelp.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_1_1_print.txt b/test/txtfiles/single_widghet_app_1_1_print.txt new file mode 100644 index 000000000..2a51f14bb --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_1_print.txt @@ -0,0 +1,8 @@ +App  (20, 80) +content: (20, 80) +├─ PlaceHolderWidget  (10, 80) +│ content: (10, 80) +├─ PlaceHolderWidget  (10, 40) +│ content: (10, 40) +└─ PlaceHolderWidget  (10, 40) + content: (10, 40) diff --git a/test/txtfiles/single_widghet_app_1_2.txt b/test/txtfiles/single_widghet_app_1_2.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_2.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_1_2_help.txt b/test/txtfiles/single_widghet_app_1_2_help.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_2_help.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_1_2_nohelp.txt b/test/txtfiles/single_widghet_app_1_2_nohelp.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_2_nohelp.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_1_2_print.txt b/test/txtfiles/single_widghet_app_1_2_print.txt new file mode 100644 index 000000000..2a51f14bb --- /dev/null +++ b/test/txtfiles/single_widghet_app_1_2_print.txt @@ -0,0 +1,8 @@ +App  (20, 80) +content: (20, 80) +├─ PlaceHolderWidget  (10, 80) +│ content: (10, 80) +├─ PlaceHolderWidget  (10, 40) +│ content: (10, 40) +└─ PlaceHolderWidget  (10, 40) + content: (10, 40) diff --git a/test/txtfiles/single_widghet_app_2_1.txt b/test/txtfiles/single_widghet_app_2_1.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_1.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_2_1_help.txt b/test/txtfiles/single_widghet_app_2_1_help.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_1_help.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_2_1_nohelp.txt b/test/txtfiles/single_widghet_app_2_1_nohelp.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_1_nohelp.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_2_1_print.txt b/test/txtfiles/single_widghet_app_2_1_print.txt new file mode 100644 index 000000000..2a51f14bb --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_1_print.txt @@ -0,0 +1,8 @@ +App  (20, 80) +content: (20, 80) +├─ PlaceHolderWidget  (10, 80) +│ content: (10, 80) +├─ PlaceHolderWidget  (10, 40) +│ content: (10, 40) +└─ PlaceHolderWidget  (10, 40) + content: (10, 40) diff --git a/test/txtfiles/single_widghet_app_2_2.txt b/test/txtfiles/single_widghet_app_2_2.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_2.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_2_2_help.txt b/test/txtfiles/single_widghet_app_2_2_help.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_2_help.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_2_2_nohelp.txt b/test/txtfiles/single_widghet_app_2_2_nohelp.txt new file mode 100644 index 000000000..2c087a1d1 --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_2_nohelp.txt @@ -0,0 +1,20 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ r (10, 40 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  g (10, 40  ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ b (10, 80 ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ \ No newline at end of file diff --git a/test/txtfiles/single_widghet_app_2_2_print.txt b/test/txtfiles/single_widghet_app_2_2_print.txt new file mode 100644 index 000000000..2a51f14bb --- /dev/null +++ b/test/txtfiles/single_widghet_app_2_2_print.txt @@ -0,0 +1,8 @@ +App  (20, 80) +content: (20, 80) +├─ PlaceHolderWidget  (10, 80) +│ content: (10, 80) +├─ PlaceHolderWidget  (10, 40) +│ content: (10, 40) +└─ PlaceHolderWidget  (10, 40) + content: (10, 40) diff --git a/test/txtfiles/small_panel_title_1_1_1.txt b/test/txtfiles/small_panel_title_1_1_1.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_1_1.txt +++ b/test/txtfiles/small_panel_title_1_1_1.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_1_2.txt b/test/txtfiles/small_panel_title_1_1_2.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_1_2.txt +++ b/test/txtfiles/small_panel_title_1_1_2.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_1_3.txt b/test/txtfiles/small_panel_title_1_1_3.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_1_3.txt +++ b/test/txtfiles/small_panel_title_1_1_3.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_2_1.txt b/test/txtfiles/small_panel_title_1_2_1.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_2_1.txt +++ b/test/txtfiles/small_panel_title_1_2_1.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_2_2.txt b/test/txtfiles/small_panel_title_1_2_2.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_2_2.txt +++ b/test/txtfiles/small_panel_title_1_2_2.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_2_3.txt b/test/txtfiles/small_panel_title_1_2_3.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_2_3.txt +++ b/test/txtfiles/small_panel_title_1_2_3.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_3_1.txt b/test/txtfiles/small_panel_title_1_3_1.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_3_1.txt +++ b/test/txtfiles/small_panel_title_1_3_1.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_3_2.txt b/test/txtfiles/small_panel_title_1_3_2.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_3_2.txt +++ b/test/txtfiles/small_panel_title_1_3_2.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_3_3.txt b/test/txtfiles/small_panel_title_1_3_3.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_3_3.txt +++ b/test/txtfiles/small_panel_title_1_3_3.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_4_1.txt b/test/txtfiles/small_panel_title_1_4_1.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_4_1.txt +++ b/test/txtfiles/small_panel_title_1_4_1.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_4_2.txt b/test/txtfiles/small_panel_title_1_4_2.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_4_2.txt +++ b/test/txtfiles/small_panel_title_1_4_2.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_1_4_3.txt b/test/txtfiles/small_panel_title_1_4_3.txt index df8da5d1f..53c06adbd 100644 --- a/test/txtfiles/small_panel_title_1_4_3.txt +++ b/test/txtfiles/small_panel_title_1_4_3.txt @@ -1,3 +1,3 @@ ╭───╮ -│ │ +│ │ ╰───╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_1_1.txt b/test/txtfiles/small_panel_title_2_1_1.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_1_1.txt +++ b/test/txtfiles/small_panel_title_2_1_1.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_1_2.txt b/test/txtfiles/small_panel_title_2_1_2.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_1_2.txt +++ b/test/txtfiles/small_panel_title_2_1_2.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_1_3.txt b/test/txtfiles/small_panel_title_2_1_3.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_1_3.txt +++ b/test/txtfiles/small_panel_title_2_1_3.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_2_1.txt b/test/txtfiles/small_panel_title_2_2_1.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_2_1.txt +++ b/test/txtfiles/small_panel_title_2_2_1.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_2_2.txt b/test/txtfiles/small_panel_title_2_2_2.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_2_2.txt +++ b/test/txtfiles/small_panel_title_2_2_2.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_2_3.txt b/test/txtfiles/small_panel_title_2_2_3.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_2_3.txt +++ b/test/txtfiles/small_panel_title_2_2_3.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_3_1.txt b/test/txtfiles/small_panel_title_2_3_1.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_3_1.txt +++ b/test/txtfiles/small_panel_title_2_3_1.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_3_2.txt b/test/txtfiles/small_panel_title_2_3_2.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_3_2.txt +++ b/test/txtfiles/small_panel_title_2_3_2.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_3_3.txt b/test/txtfiles/small_panel_title_2_3_3.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_3_3.txt +++ b/test/txtfiles/small_panel_title_2_3_3.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_4_1.txt b/test/txtfiles/small_panel_title_2_4_1.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_4_1.txt +++ b/test/txtfiles/small_panel_title_2_4_1.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_4_2.txt b/test/txtfiles/small_panel_title_2_4_2.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_4_2.txt +++ b/test/txtfiles/small_panel_title_2_4_2.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_2_4_3.txt b/test/txtfiles/small_panel_title_2_4_3.txt index d1ac44399..800dd6a64 100644 --- a/test/txtfiles/small_panel_title_2_4_3.txt +++ b/test/txtfiles/small_panel_title_2_4_3.txt @@ -1,3 +1,3 @@ ╭───────╮ -│ │ +│ │ ╰───────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_1_1.txt b/test/txtfiles/small_panel_title_3_1_1.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_1_1.txt +++ b/test/txtfiles/small_panel_title_3_1_1.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_1_2.txt b/test/txtfiles/small_panel_title_3_1_2.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_1_2.txt +++ b/test/txtfiles/small_panel_title_3_1_2.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_1_3.txt b/test/txtfiles/small_panel_title_3_1_3.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_1_3.txt +++ b/test/txtfiles/small_panel_title_3_1_3.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_2_1.txt b/test/txtfiles/small_panel_title_3_2_1.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_2_1.txt +++ b/test/txtfiles/small_panel_title_3_2_1.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_2_2.txt b/test/txtfiles/small_panel_title_3_2_2.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_2_2.txt +++ b/test/txtfiles/small_panel_title_3_2_2.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_2_3.txt b/test/txtfiles/small_panel_title_3_2_3.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_2_3.txt +++ b/test/txtfiles/small_panel_title_3_2_3.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_3_1.txt b/test/txtfiles/small_panel_title_3_3_1.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_3_1.txt +++ b/test/txtfiles/small_panel_title_3_3_1.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_3_2.txt b/test/txtfiles/small_panel_title_3_3_2.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_3_2.txt +++ b/test/txtfiles/small_panel_title_3_3_2.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_3_3.txt b/test/txtfiles/small_panel_title_3_3_3.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_3_3.txt +++ b/test/txtfiles/small_panel_title_3_3_3.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_4_1.txt b/test/txtfiles/small_panel_title_3_4_1.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_4_1.txt +++ b/test/txtfiles/small_panel_title_3_4_1.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_4_2.txt b/test/txtfiles/small_panel_title_3_4_2.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_4_2.txt +++ b/test/txtfiles/small_panel_title_3_4_2.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_3_4_3.txt b/test/txtfiles/small_panel_title_3_4_3.txt index 3c8e297f4..f35c8a49b 100644 --- a/test/txtfiles/small_panel_title_3_4_3.txt +++ b/test/txtfiles/small_panel_title_3_4_3.txt @@ -1,3 +1,3 @@ ╭────────╮ -│ │ +│ │ ╰────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_1_1.txt b/test/txtfiles/small_panel_title_4_1_1.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_1_1.txt +++ b/test/txtfiles/small_panel_title_4_1_1.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_1_2.txt b/test/txtfiles/small_panel_title_4_1_2.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_1_2.txt +++ b/test/txtfiles/small_panel_title_4_1_2.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_1_3.txt b/test/txtfiles/small_panel_title_4_1_3.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_1_3.txt +++ b/test/txtfiles/small_panel_title_4_1_3.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_2_1.txt b/test/txtfiles/small_panel_title_4_2_1.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_2_1.txt +++ b/test/txtfiles/small_panel_title_4_2_1.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_2_2.txt b/test/txtfiles/small_panel_title_4_2_2.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_2_2.txt +++ b/test/txtfiles/small_panel_title_4_2_2.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_2_3.txt b/test/txtfiles/small_panel_title_4_2_3.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_2_3.txt +++ b/test/txtfiles/small_panel_title_4_2_3.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_3_1.txt b/test/txtfiles/small_panel_title_4_3_1.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_3_1.txt +++ b/test/txtfiles/small_panel_title_4_3_1.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_3_2.txt b/test/txtfiles/small_panel_title_4_3_2.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_3_2.txt +++ b/test/txtfiles/small_panel_title_4_3_2.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_3_3.txt b/test/txtfiles/small_panel_title_4_3_3.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_3_3.txt +++ b/test/txtfiles/small_panel_title_4_3_3.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_4_1.txt b/test/txtfiles/small_panel_title_4_4_1.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_4_1.txt +++ b/test/txtfiles/small_panel_title_4_4_1.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_4_2.txt b/test/txtfiles/small_panel_title_4_4_2.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_4_2.txt +++ b/test/txtfiles/small_panel_title_4_4_2.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_4_4_3.txt b/test/txtfiles/small_panel_title_4_4_3.txt index e7295f32a..d86d09388 100644 --- a/test/txtfiles/small_panel_title_4_4_3.txt +++ b/test/txtfiles/small_panel_title_4_4_3.txt @@ -1,3 +1,3 @@ ╭─────────╮ -│ │ +│ │ ╰─────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_1_1.txt b/test/txtfiles/small_panel_title_5_1_1.txt index aaf5f3b92..fc1ecd853 100644 --- a/test/txtfiles/small_panel_title_5_1_1.txt +++ b/test/txtfiles/small_panel_title_5_1_1.txt @@ -1,3 +1,3 @@ -╭──── aa ──╮ -│ │ +╭──── aa ──╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_1_2.txt b/test/txtfiles/small_panel_title_5_1_2.txt index afcf8fe20..bb5f70a0d 100644 --- a/test/txtfiles/small_panel_title_5_1_2.txt +++ b/test/txtfiles/small_panel_title_5_1_2.txt @@ -1,3 +1,3 @@ -╭─── aa ───╮ -│ │ +╭─── aa ───╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_1_3.txt b/test/txtfiles/small_panel_title_5_1_3.txt index afcf8fe20..bb5f70a0d 100644 --- a/test/txtfiles/small_panel_title_5_1_3.txt +++ b/test/txtfiles/small_panel_title_5_1_3.txt @@ -1,3 +1,3 @@ -╭─── aa ───╮ -│ │ +╭─── aa ───╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_2_1.txt b/test/txtfiles/small_panel_title_5_2_1.txt index d78bc80e4..1fa70aa7a 100644 --- a/test/txtfiles/small_panel_title_5_2_1.txt +++ b/test/txtfiles/small_panel_title_5_2_1.txt @@ -1,3 +1,3 @@ -╭── aaaa ──╮ -│ │ +╭── aaaa ──╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_2_2.txt b/test/txtfiles/small_panel_title_5_2_2.txt index d78bc80e4..1fa70aa7a 100644 --- a/test/txtfiles/small_panel_title_5_2_2.txt +++ b/test/txtfiles/small_panel_title_5_2_2.txt @@ -1,3 +1,3 @@ -╭── aaaa ──╮ -│ │ +╭── aaaa ──╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_2_3.txt b/test/txtfiles/small_panel_title_5_2_3.txt index 0a549bef7..acf8d2d08 100644 --- a/test/txtfiles/small_panel_title_5_2_3.txt +++ b/test/txtfiles/small_panel_title_5_2_3.txt @@ -1,3 +1,3 @@ -╭─ aaaa ───╮ -│ │ +╭─ aaaa ───╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_3_1.txt b/test/txtfiles/small_panel_title_5_3_1.txt index 20eb27199..93d141d20 100644 --- a/test/txtfiles/small_panel_title_5_3_1.txt +++ b/test/txtfiles/small_panel_title_5_3_1.txt @@ -1,3 +1,3 @@ -╭── a... ──╮ -│ │ +╭── a... ──╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_3_2.txt b/test/txtfiles/small_panel_title_5_3_2.txt index 20eb27199..93d141d20 100644 --- a/test/txtfiles/small_panel_title_5_3_2.txt +++ b/test/txtfiles/small_panel_title_5_3_2.txt @@ -1,3 +1,3 @@ -╭── a... ──╮ -│ │ +╭── a... ──╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_3_3.txt b/test/txtfiles/small_panel_title_5_3_3.txt index 4217353e6..9066433de 100644 --- a/test/txtfiles/small_panel_title_5_3_3.txt +++ b/test/txtfiles/small_panel_title_5_3_3.txt @@ -1,3 +1,3 @@ -╭─ a... ───╮ -│ │ +╭─ a... ───╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_4_1.txt b/test/txtfiles/small_panel_title_5_4_1.txt index 20eb27199..93d141d20 100644 --- a/test/txtfiles/small_panel_title_5_4_1.txt +++ b/test/txtfiles/small_panel_title_5_4_1.txt @@ -1,3 +1,3 @@ -╭── a... ──╮ -│ │ +╭── a... ──╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_4_2.txt b/test/txtfiles/small_panel_title_5_4_2.txt index 20eb27199..93d141d20 100644 --- a/test/txtfiles/small_panel_title_5_4_2.txt +++ b/test/txtfiles/small_panel_title_5_4_2.txt @@ -1,3 +1,3 @@ -╭── a... ──╮ -│ │ +╭── a... ──╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_5_4_3.txt b/test/txtfiles/small_panel_title_5_4_3.txt index 4217353e6..9066433de 100644 --- a/test/txtfiles/small_panel_title_5_4_3.txt +++ b/test/txtfiles/small_panel_title_5_4_3.txt @@ -1,3 +1,3 @@ -╭─ a... ───╮ -│ │ +╭─ a... ───╮ +│ │ ╰──────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_1_1.txt b/test/txtfiles/small_panel_title_6_1_1.txt index 042ae5b9d..ddb201dbb 100644 --- a/test/txtfiles/small_panel_title_6_1_1.txt +++ b/test/txtfiles/small_panel_title_6_1_1.txt @@ -1,3 +1,3 @@ -╭──── aa ───╮ -│ │ +╭──── aa ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_1_2.txt b/test/txtfiles/small_panel_title_6_1_2.txt index 3a38d6dc8..71142edce 100644 --- a/test/txtfiles/small_panel_title_6_1_2.txt +++ b/test/txtfiles/small_panel_title_6_1_2.txt @@ -1,3 +1,3 @@ -╭─── aa ────╮ -│ │ +╭─── aa ────╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_1_3.txt b/test/txtfiles/small_panel_title_6_1_3.txt index 042ae5b9d..ddb201dbb 100644 --- a/test/txtfiles/small_panel_title_6_1_3.txt +++ b/test/txtfiles/small_panel_title_6_1_3.txt @@ -1,3 +1,3 @@ -╭──── aa ───╮ -│ │ +╭──── aa ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_2_1.txt b/test/txtfiles/small_panel_title_6_2_1.txt index f055e4166..492a741fd 100644 --- a/test/txtfiles/small_panel_title_6_2_1.txt +++ b/test/txtfiles/small_panel_title_6_2_1.txt @@ -1,3 +1,3 @@ -╭──── aaaa ─╮ -│ │ +╭──── aaaa ─╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_2_2.txt b/test/txtfiles/small_panel_title_6_2_2.txt index a842ff4f9..dbc99e0f8 100644 --- a/test/txtfiles/small_panel_title_6_2_2.txt +++ b/test/txtfiles/small_panel_title_6_2_2.txt @@ -1,3 +1,3 @@ -╭── aaaa ───╮ -│ │ +╭── aaaa ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_2_3.txt b/test/txtfiles/small_panel_title_6_2_3.txt index a842ff4f9..dbc99e0f8 100644 --- a/test/txtfiles/small_panel_title_6_2_3.txt +++ b/test/txtfiles/small_panel_title_6_2_3.txt @@ -1,3 +1,3 @@ -╭── aaaa ───╮ -│ │ +╭── aaaa ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_3_1.txt b/test/txtfiles/small_panel_title_6_3_1.txt index 39836b217..7d5ae28ed 100644 --- a/test/txtfiles/small_panel_title_6_3_1.txt +++ b/test/txtfiles/small_panel_title_6_3_1.txt @@ -1,3 +1,3 @@ -╭──── a... ─╮ -│ │ +╭──── a... ─╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_3_2.txt b/test/txtfiles/small_panel_title_6_3_2.txt index 40c577882..57d5a2acf 100644 --- a/test/txtfiles/small_panel_title_6_3_2.txt +++ b/test/txtfiles/small_panel_title_6_3_2.txt @@ -1,3 +1,3 @@ -╭── a... ───╮ -│ │ +╭── a... ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_3_3.txt b/test/txtfiles/small_panel_title_6_3_3.txt index 40c577882..57d5a2acf 100644 --- a/test/txtfiles/small_panel_title_6_3_3.txt +++ b/test/txtfiles/small_panel_title_6_3_3.txt @@ -1,3 +1,3 @@ -╭── a... ───╮ -│ │ +╭── a... ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_4_1.txt b/test/txtfiles/small_panel_title_6_4_1.txt index 39836b217..7d5ae28ed 100644 --- a/test/txtfiles/small_panel_title_6_4_1.txt +++ b/test/txtfiles/small_panel_title_6_4_1.txt @@ -1,3 +1,3 @@ -╭──── a... ─╮ -│ │ +╭──── a... ─╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_4_2.txt b/test/txtfiles/small_panel_title_6_4_2.txt index 40c577882..57d5a2acf 100644 --- a/test/txtfiles/small_panel_title_6_4_2.txt +++ b/test/txtfiles/small_panel_title_6_4_2.txt @@ -1,3 +1,3 @@ -╭── a... ───╮ -│ │ +╭── a... ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_6_4_3.txt b/test/txtfiles/small_panel_title_6_4_3.txt index 40c577882..57d5a2acf 100644 --- a/test/txtfiles/small_panel_title_6_4_3.txt +++ b/test/txtfiles/small_panel_title_6_4_3.txt @@ -1,3 +1,3 @@ -╭── a... ───╮ -│ │ +╭── a... ───╮ +│ │ ╰───────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_1_1.txt b/test/txtfiles/small_panel_title_7_1_1.txt index a2c55e6ba..5c995fe76 100644 --- a/test/txtfiles/small_panel_title_7_1_1.txt +++ b/test/txtfiles/small_panel_title_7_1_1.txt @@ -1,3 +1,3 @@ -╭──── aa ────╮ -│ │ +╭──── aa ────╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_1_2.txt b/test/txtfiles/small_panel_title_7_1_2.txt index a2c55e6ba..5c995fe76 100644 --- a/test/txtfiles/small_panel_title_7_1_2.txt +++ b/test/txtfiles/small_panel_title_7_1_2.txt @@ -1,3 +1,3 @@ -╭──── aa ────╮ -│ │ +╭──── aa ────╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_1_3.txt b/test/txtfiles/small_panel_title_7_1_3.txt index d92d6d09c..504c9c608 100644 --- a/test/txtfiles/small_panel_title_7_1_3.txt +++ b/test/txtfiles/small_panel_title_7_1_3.txt @@ -1,3 +1,3 @@ -╭───── aa ───╮ -│ │ +╭───── aa ───╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_2_1.txt b/test/txtfiles/small_panel_title_7_2_1.txt index 7fd599ba9..a40964834 100644 --- a/test/txtfiles/small_panel_title_7_2_1.txt +++ b/test/txtfiles/small_panel_title_7_2_1.txt @@ -1,3 +1,3 @@ -╭──── aaaa ──╮ -│ │ +╭──── aaaa ──╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_2_2.txt b/test/txtfiles/small_panel_title_7_2_2.txt index 1dd35c1a1..b2b7eef99 100644 --- a/test/txtfiles/small_panel_title_7_2_2.txt +++ b/test/txtfiles/small_panel_title_7_2_2.txt @@ -1,3 +1,3 @@ -╭─── aaaa ───╮ -│ │ +╭─── aaaa ───╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_2_3.txt b/test/txtfiles/small_panel_title_7_2_3.txt index 1dd35c1a1..b2b7eef99 100644 --- a/test/txtfiles/small_panel_title_7_2_3.txt +++ b/test/txtfiles/small_panel_title_7_2_3.txt @@ -1,3 +1,3 @@ -╭─── aaaa ───╮ -│ │ +╭─── aaaa ───╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_3_1.txt b/test/txtfiles/small_panel_title_7_3_1.txt index 55fd33ac6..c8e3df330 100644 --- a/test/txtfiles/small_panel_title_7_3_1.txt +++ b/test/txtfiles/small_panel_title_7_3_1.txt @@ -1,3 +1,3 @@ -╭──── a... ──╮ -│ │ +╭──── a... ──╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_3_2.txt b/test/txtfiles/small_panel_title_7_3_2.txt index 91c97bb9b..bb21c0f0d 100644 --- a/test/txtfiles/small_panel_title_7_3_2.txt +++ b/test/txtfiles/small_panel_title_7_3_2.txt @@ -1,3 +1,3 @@ -╭─── a... ───╮ -│ │ +╭─── a... ───╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_3_3.txt b/test/txtfiles/small_panel_title_7_3_3.txt index 91c97bb9b..bb21c0f0d 100644 --- a/test/txtfiles/small_panel_title_7_3_3.txt +++ b/test/txtfiles/small_panel_title_7_3_3.txt @@ -1,3 +1,3 @@ -╭─── a... ───╮ -│ │ +╭─── a... ───╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_4_1.txt b/test/txtfiles/small_panel_title_7_4_1.txt index 55fd33ac6..c8e3df330 100644 --- a/test/txtfiles/small_panel_title_7_4_1.txt +++ b/test/txtfiles/small_panel_title_7_4_1.txt @@ -1,3 +1,3 @@ -╭──── a... ──╮ -│ │ +╭──── a... ──╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_4_2.txt b/test/txtfiles/small_panel_title_7_4_2.txt index 91c97bb9b..bb21c0f0d 100644 --- a/test/txtfiles/small_panel_title_7_4_2.txt +++ b/test/txtfiles/small_panel_title_7_4_2.txt @@ -1,3 +1,3 @@ -╭─── a... ───╮ -│ │ +╭─── a... ───╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_7_4_3.txt b/test/txtfiles/small_panel_title_7_4_3.txt index 91c97bb9b..bb21c0f0d 100644 --- a/test/txtfiles/small_panel_title_7_4_3.txt +++ b/test/txtfiles/small_panel_title_7_4_3.txt @@ -1,3 +1,3 @@ -╭─── a... ───╮ -│ │ +╭─── a... ───╮ +│ │ ╰────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_1_1.txt b/test/txtfiles/small_panel_title_8_1_1.txt index c3b3626bc..4328bbaf6 100644 --- a/test/txtfiles/small_panel_title_8_1_1.txt +++ b/test/txtfiles/small_panel_title_8_1_1.txt @@ -1,3 +1,3 @@ -╭──── aa ─────╮ -│ │ +╭──── aa ─────╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_1_2.txt b/test/txtfiles/small_panel_title_8_1_2.txt index c3b3626bc..4328bbaf6 100644 --- a/test/txtfiles/small_panel_title_8_1_2.txt +++ b/test/txtfiles/small_panel_title_8_1_2.txt @@ -1,3 +1,3 @@ -╭──── aa ─────╮ -│ │ +╭──── aa ─────╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_1_3.txt b/test/txtfiles/small_panel_title_8_1_3.txt index 2ab16d1e1..5ba4246f1 100644 --- a/test/txtfiles/small_panel_title_8_1_3.txt +++ b/test/txtfiles/small_panel_title_8_1_3.txt @@ -1,3 +1,3 @@ -╭────── aa ───╮ -│ │ +╭────── aa ───╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_2_1.txt b/test/txtfiles/small_panel_title_8_2_1.txt index ffe2714b2..cc0c0b581 100644 --- a/test/txtfiles/small_panel_title_8_2_1.txt +++ b/test/txtfiles/small_panel_title_8_2_1.txt @@ -1,3 +1,3 @@ -╭──── aaaa ───╮ -│ │ +╭──── aaaa ───╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_2_2.txt b/test/txtfiles/small_panel_title_8_2_2.txt index 7673c0be9..7b4e45dfc 100644 --- a/test/txtfiles/small_panel_title_8_2_2.txt +++ b/test/txtfiles/small_panel_title_8_2_2.txt @@ -1,3 +1,3 @@ -╭─── aaaa ────╮ -│ │ +╭─── aaaa ────╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_2_3.txt b/test/txtfiles/small_panel_title_8_2_3.txt index ffe2714b2..cc0c0b581 100644 --- a/test/txtfiles/small_panel_title_8_2_3.txt +++ b/test/txtfiles/small_panel_title_8_2_3.txt @@ -1,3 +1,3 @@ -╭──── aaaa ───╮ -│ │ +╭──── aaaa ───╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_3_1.txt b/test/txtfiles/small_panel_title_8_3_1.txt index 596643ab5..684a08766 100644 --- a/test/txtfiles/small_panel_title_8_3_1.txt +++ b/test/txtfiles/small_panel_title_8_3_1.txt @@ -1,3 +1,3 @@ -╭──── a... ───╮ -│ │ +╭──── a... ───╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_3_2.txt b/test/txtfiles/small_panel_title_8_3_2.txt index e178dd43c..0bd5e9f8d 100644 --- a/test/txtfiles/small_panel_title_8_3_2.txt +++ b/test/txtfiles/small_panel_title_8_3_2.txt @@ -1,3 +1,3 @@ -╭─── a... ────╮ -│ │ +╭─── a... ────╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_3_3.txt b/test/txtfiles/small_panel_title_8_3_3.txt index 596643ab5..684a08766 100644 --- a/test/txtfiles/small_panel_title_8_3_3.txt +++ b/test/txtfiles/small_panel_title_8_3_3.txt @@ -1,3 +1,3 @@ -╭──── a... ───╮ -│ │ +╭──── a... ───╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_4_1.txt b/test/txtfiles/small_panel_title_8_4_1.txt index 596643ab5..684a08766 100644 --- a/test/txtfiles/small_panel_title_8_4_1.txt +++ b/test/txtfiles/small_panel_title_8_4_1.txt @@ -1,3 +1,3 @@ -╭──── a... ───╮ -│ │ +╭──── a... ───╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_4_2.txt b/test/txtfiles/small_panel_title_8_4_2.txt index e178dd43c..0bd5e9f8d 100644 --- a/test/txtfiles/small_panel_title_8_4_2.txt +++ b/test/txtfiles/small_panel_title_8_4_2.txt @@ -1,3 +1,3 @@ -╭─── a... ────╮ -│ │ +╭─── a... ────╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/small_panel_title_8_4_3.txt b/test/txtfiles/small_panel_title_8_4_3.txt index 596643ab5..684a08766 100644 --- a/test/txtfiles/small_panel_title_8_4_3.txt +++ b/test/txtfiles/small_panel_title_8_4_3.txt @@ -1,3 +1,3 @@ -╭──── a... ───╮ -│ │ +╭──── a... ───╮ +│ │ ╰─────────────╯ \ No newline at end of file diff --git a/test/txtfiles/termshow_1.txt b/test/txtfiles/termshow_1.txt index ee08381c2..469636c96 100644 --- a/test/txtfiles/termshow_1.txt +++ b/test/txtfiles/termshow_1.txt @@ -1,8 +1,8 @@ ╭─────────────────╮ -│ │ -│   (1)   1   │ -│   (2)   2   │ -│   (3)   3   │ -│   │ -│ │ -╰──────── 3... ───╯ +│ │ +│   (1)   1   │ +│   (2)   2   │ +│   (3)   3   │ +│   │ +│ │ +╰──────── 3... ───╯ diff --git a/test/txtfiles/termshow_10.txt b/test/txtfiles/termshow_10.txt index 617834d03..babbd5667 100644 --- a/test/txtfiles/termshow_10.txt +++ b/test/txtfiles/termshow_10.txt @@ -1,13 +1,13 @@ -╭──── Matrix {Float64}  ────────────────╮ -│ │ -│   │ -│     (1)   (2)   (3)   (4)   (5)   │ -│   │ -│   (1)   0.0   0.0   0.0   0.0   0.0   │ -│   (2)   0.0   0.0   0.0   0.0   0.0   │ -│   (3)   0.0   0.0   0.0   0.0   0.0   │ -│   (4)   0.0   0.0   0.0   0.0   0.0   │ -│   (5)   0.0   0.0   0.0   0.0   0.0   │ -│   │ -│ │ -╰──────────────────────────── 5 × 5  ───╯ +╭──── Matrix {Float64}  ────────────────╮ +│ │ +│   │ +│     (1)   (2)   (3)   (4)   (5)   │ +│   │ +│   (1)   0.0   0.0   0.0   0.0   0.0   │ +│   (2)   0.0   0.0   0.0   0.0   0.0   │ +│   (3)   0.0   0.0   0.0   0.0   0.0   │ +│   (4)   0.0   0.0   0.0   0.0   0.0   │ +│   (5)   0.0   0.0   0.0   0.0   0.0   │ +│   │ +│ │ +╰──────────────────────────── 5 × 5  ───╯ diff --git a/test/txtfiles/termshow_11.txt b/test/txtfiles/termshow_11.txt index 5cd786124..e1a9a1e9a 100644 --- a/test/txtfiles/termshow_11.txt +++ b/test/txtfiles/termshow_11.txt @@ -1,347 +1,347 @@ -╭──── Array {Float64, 3}  ───────────────────────╮ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 1] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 2] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 3] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 4] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 5] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 6] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 7] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 8] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰────────────────────────────── [:, :, 9] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   (4)   (100)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ -│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ -│ │   │ │ -│ ╰───────────────────────────── [:, :, 10] ───╯ │ -│ │ -│ │ -│ ╭────────────────────────────────────────────╮ │ -│ │ 90 frames omitted │ │ -│ ╰────────────────────────────────────────────╯ │ -│ │ -╰──────────────────────────── 100 × 100 × 100 ───╯ +╭──── Array {Float64, 3}  ───────────────────────╮ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 1] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 2] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 3] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 4] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 5] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 6] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 7] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 8] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰────────────────────────────── [:, :, 9] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   (4)   (100)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (2)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (3)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (4)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (5)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (6)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (7)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (8)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (9)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (10)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (11)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (12)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (13)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (14)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (15)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (16)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (17)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (18)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (19)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (20)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (21)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (22)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (23)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (24)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │   (25)   0.0   0.0   0.0   0.0   ⋯   │ │ +│ │     ⋮   ⋮   ⋮   ⋮   ⋱   │ │ +│ │   │ │ +│ ╰───────────────────────────── [:, :, 10] ───╯ │ +│ │ +│ │ +│ ╭────────────────────────────────────────────╮ │ +│ │ 90 frames omitted │ │ +│ ╰────────────────────────────────────────────╯ │ +│ │ +╰──────────────────────────── 100 × 100 × 100 ───╯ diff --git a/test/txtfiles/termshow_12.txt b/test/txtfiles/termshow_12.txt deleted file mode 100644 index c99e33159..000000000 --- a/test/txtfiles/termshow_12.txt +++ /dev/null @@ -1,109 +0,0 @@ - ╭─────────────────────────────────────────────────────────────────────────╮ - │ │ - │ Panel <: Term.Panels.AbstractPanel │ - │ │segments ::Vector │ - │ │ measure ::Term.Measures.Measure │ - │ │ - ╰─────────────────────────────────────────────────────────────────────────╯ -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Docstring ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - ┌──────────────────────────────────────────────────────────────────┐ - │ Panel  │ - └──────────────────────────────────────────────────────────────────┘ - -`Renderable` with a panel surrounding some content: - - ┌──────────────────────────────────────────────────────────────────┐ - │  ╭──────────╮  │ - │  │ my panel │  │ - │  ╰──────────╯  │ - └──────────────────────────────────────────────────────────────────┘ - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -When constructing a Panel, several keyword arguments can be used to set its -appearance: - - • box::Symbol sets the `Box` type for the Panel's border - • style::String sets the box's style (e.g., color) - • title::Union sets the Panel's title - • title_style::Union sets the title's style - • title_justify::Symbol sets the location of the title - • subtitle::Union sets the Panel's subtitle - • subtitle_style::Union sets the subtitle's style - • subtitle_justify::Symbol sets the location of the subtitle - • justify::Symbol sets text's alignment (:left, :rigth, :center, :justify) - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - ┌──────────────────────────────────────────────────────────────────┐ - │ Panel(;   │ - │  fit::Bool = false,  │ - │  height::Int = 2,  │ - │  width::Int = 80,  │ - │  padding::Union{{Vector,Padding,NTuple}} = Padding(0,  │ - │ 0, 0, 0),  │ - │  kwargs...,   │ - │ )  │ - └──────────────────────────────────────────────────────────────────┘ - -Construct a `Panel` with no content. - - Examples - - ┌──────────────────────────────────────────────────────────────────┐ - │ julia> Panel(height=5, width=10)  │ - │ ╭────────╮  │ - │ │ │  │ - │ │ │  │ - │ │ │  │ - │ ╰────────╯  │ - │   │ - │ julia> Panel(height=3, width=5)  │ - │ ╭───╮  │ - │ │ │  │ - │ ╰───╯  │ - └──────────────────────────────────────────────────────────────────┘ - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - ┌──────────────────────────────────────────────────────────────────┐ - │ Panel(  │ - │  content::Union{{AbstractString,AbstractRenderable}};  │ - │  fit::Bool = false,  │ - │  padding::Union{{Nothing,Padding,NTuple}} = nothing,  │ - │  kwargs...,  │ - │ )  │ - └──────────────────────────────────────────────────────────────────┘ - -Construct a `Panel` around an `AbstractRenderable` or `AbstractString`. - -This is the main Panel-creating function, it dispatches to other methods based -on the value of `fit` to either fith the `Panel` to its content or vice versa. - -`kwargs` can be used to set various aspects of the `Panel`'s appearance like -the presence and style of titles, box type etc... see render (@ref) below. - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - ┌──────────────────────────────────────────────────────────────────┐ - │ Panel(  │ - │  content::Union{{AbstractString,AbstractRenderable}},  │ - │  ::Val{{true}},  │ - │  padding::Padding;  │ - │  height::Union{{Nothing,Int}} = nothing,  │ - │  width::Union{{Nothing,Int}} = nothing,  │ - │  trim::Bool = true,  │ - │  kwargs...,  │ - │ )  │ - └──────────────────────────────────────────────────────────────────┘ - -Construct a `Panel` fitting the content's width. - - ╭──── Warning ─────────────────────────────────────────────────────────╮ - │ If the content is larger than the console terminal's width, │ - │ it will │ - │ get trimmed │ - │ to avoid overflow, unless `trim=false` is given. │ - ╰──────────────────────────────────────────────────────────────────────╯ -28 lines omitted... \ No newline at end of file diff --git a/test/txtfiles/termshow_2.txt b/test/txtfiles/termshow_2.txt index a545e0a55..9512f7e3d 100644 --- a/test/txtfiles/termshow_2.txt +++ b/test/txtfiles/termshow_2.txt @@ -1,6 +1,7 @@ -╭──── Dict {Any, Any}  ──────────────────────────╮ -│ │ -│  {String} │ a => Dict(:z => "a") │  {Dict}  │ -│  {Symbol} │ x => [1, 2, 3] │ {Vector}  │ -│ │ -╰──────────────────────────────────── 2 items ───╯ +╭──── Dict {Any, Any}  ──────────────────────────╮ +│ │ +│   {String}  a => Dict(:z => "a")   {Dict}    │ +│   {Symbol}  x =>  [1, 2, 3]   {Vector}   │ +│   │ +│ │ +╰────────────────────────────────────────────────╯ diff --git a/test/txtfiles/termshow_3.txt b/test/txtfiles/termshow_3.txt index 1a2e7702c..be02676c5 100644 --- a/test/txtfiles/termshow_3.txt +++ b/test/txtfiles/termshow_3.txt @@ -1,15 +1,105 @@ -╭──── Dict {Int64, Int64}  ────────╮ -│ │ -│  {Int64} │ 5 => 5 │ {Int64}  │ -│  {Int64} │ 56 => 56 │ {Int64}  │ -│  {Int64} │ 35 => 35 │ {Int64}  │ -│  {Int64} │ 55 => 55 │ {Int64}  │ -│  {Int64} │ 60 => 60 │ {Int64}  │ -│  {Int64} │ 30 => 30 │ {Int64}  │ -│  {Int64} │ 32 => 32 │ {Int64}  │ -│  {Int64} │ 6 => 6 │ {Int64}  │ -│  {Int64} │ 67 => 67 │ {Int64}  │ -│  {Int64} │ 45 => 45 │ {Int64}  │ -│ ⋮ │ ⋮ ⋮ │ ⋮ │ -│ │ -╰──────────────────── 100 items ───╯ +╭──── Dict {Int64, Int64}  ──────────╮ +│ │ +│   {Int64}   5  =>  5   {Int64}   │ +│   {Int64}  56  => 56   {Int64}   │ +│   {Int64}  35  => 35   {Int64}   │ +│   {Int64}  55  => 55   {Int64}   │ +│   {Int64}  60  => 60   {Int64}   │ +│   {Int64}  30  => 30   {Int64}   │ +│   {Int64}  32  => 32   {Int64}   │ +│   {Int64}   6  =>  6   {Int64}   │ +│   {Int64}  67  => 67   {Int64}   │ +│   {Int64}  45  => 45   {Int64}   │ +│   {Int64}  73  => 73   {Int64}   │ +│   {Int64}  64  => 64   {Int64}   │ +│   {Int64}  90  => 90   {Int64}   │ +│   {Int64}   4  =>  4   {Int64}   │ +│   {Int64}  13  => 13   {Int64}   │ +│   {Int64}  54  => 54   {Int64}   │ +│   {Int64}  63  => 63   {Int64}   │ +│   {Int64}  86  => 86   {Int64}   │ +│   {Int64}  91  => 91   {Int64}   │ +│   {Int64}  62  => 62   {Int64}   │ +│   {Int64}  58  => 58   {Int64}   │ +│   {Int64}  52  => 52   {Int64}   │ +│   {Int64}  12  => 12   {Int64}   │ +│   {Int64}  28  => 28   {Int64}   │ +│   {Int64}  75  => 75   {Int64}   │ +│   {Int64}  23  => 23   {Int64}   │ +│   {Int64}  92  => 92   {Int64}   │ +│   {Int64}  41  => 41   {Int64}   │ +│   {Int64}  43  => 43   {Int64}   │ +│   {Int64}  11  => 11   {Int64}   │ +│   {Int64}  36  => 36   {Int64}   │ +│   {Int64}  68  => 68   {Int64}   │ +│   {Int64}  69  => 69   {Int64}   │ +│   {Int64}  98  => 98   {Int64}   │ +│   {Int64}  82  => 82   {Int64}   │ +│   {Int64}  85  => 85   {Int64}   │ +│   {Int64}  39  => 39   {Int64}   │ +│   {Int64}  84  => 84   {Int64}   │ +│   {Int64}  77  => 77   {Int64}   │ +│   {Int64}   7  =>  7   {Int64}   │ +│   {Int64}  25  => 25   {Int64}   │ +│   {Int64}  95  => 95   {Int64}   │ +│   {Int64}  71  => 71   {Int64}   │ +│   {Int64}  66  => 66   {Int64}   │ +│   {Int64}  76  => 76   {Int64}   │ +│   {Int64}  34  => 34   {Int64}   │ +│   {Int64}  50  => 50   {Int64}   │ +│   {Int64}  59  => 59   {Int64}   │ +│   {Int64}  93  => 93   {Int64}   │ +│   {Int64}   2  =>  2   {Int64}   │ +│   {Int64}  10  => 10   {Int64}   │ +│   {Int64}  18  => 18   {Int64}   │ +│   {Int64}  26  => 26   {Int64}   │ +│   {Int64}  27  => 27   {Int64}   │ +│   {Int64}  42  => 42   {Int64}   │ +│   {Int64}  87  => 87   {Int64}   │ +│   {Int64}  100 => 100  {Int64}   │ +│   {Int64}  79  => 79   {Int64}   │ +│   {Int64}  16  => 16   {Int64}   │ +│   {Int64}  20  => 20   {Int64}   │ +│   {Int64}  81  => 81   {Int64}   │ +│   {Int64}  19  => 19   {Int64}   │ +│   {Int64}  49  => 49   {Int64}   │ +│   {Int64}  44  => 44   {Int64}   │ +│   {Int64}   9  =>  9   {Int64}   │ +│   {Int64}  31  => 31   {Int64}   │ +│   {Int64}  74  => 74   {Int64}   │ +│   {Int64}  61  => 61   {Int64}   │ +│   {Int64}  29  => 29   {Int64}   │ +│   {Int64}  94  => 94   {Int64}   │ +│   {Int64}  46  => 46   {Int64}   │ +│   {Int64}  57  => 57   {Int64}   │ +│   {Int64}  70  => 70   {Int64}   │ +│   {Int64}  21  => 21   {Int64}   │ +│   {Int64}  38  => 38   {Int64}   │ +│   {Int64}  88  => 88   {Int64}   │ +│   {Int64}  78  => 78   {Int64}   │ +│   {Int64}  72  => 72   {Int64}   │ +│   {Int64}  24  => 24   {Int64}   │ +│   {Int64}   8  =>  8   {Int64}   │ +│   {Int64}  17  => 17   {Int64}   │ +│   {Int64}  37  => 37   {Int64}   │ +│   {Int64}   1  =>  1   {Int64}   │ +│   {Int64}  53  => 53   {Int64}   │ +│   {Int64}  22  => 22   {Int64}   │ +│   {Int64}  47  => 47   {Int64}   │ +│   {Int64}  83  => 83   {Int64}   │ +│   {Int64}  99  => 99   {Int64}   │ +│   {Int64}  89  => 89   {Int64}   │ +│   {Int64}  14  => 14   {Int64}   │ +│   {Int64}   3  =>  3   {Int64}   │ +│   {Int64}  80  => 80   {Int64}   │ +│   {Int64}  96  => 96   {Int64}   │ +│   {Int64}  51  => 51   {Int64}   │ +│   {Int64}  33  => 33   {Int64}   │ +│   {Int64}  40  => 40   {Int64}   │ +│   {Int64}  48  => 48   {Int64}   │ +│   {Int64}  15  => 15   {Int64}   │ +│   {Int64}  65  => 65   {Int64}   │ +│   {Int64}  97  => 97   {Int64}   │ +│   │ +│ │ +╰────────────────────────────────────╯ diff --git a/test/txtfiles/termshow_4.txt b/test/txtfiles/termshow_4.txt index 294f4ed33..62c4d3b60 100644 --- a/test/txtfiles/termshow_4.txt +++ b/test/txtfiles/termshow_4.txt @@ -1,59 +1,59 @@ -╭──── Matrix {Float64}  ───────────────────╮ -│ │ -│   │ -│     (1)   (2)   (3)   (4)   (300)   │ -│   │ -│   (1)   0.0   0.0   0.0   0.0   ⋯   │ -│   (2)   0.0   0.0   0.0   0.0   ⋯   │ -│   (3)   0.0   0.0   0.0   0.0   ⋯   │ -│   (4)   0.0   0.0   0.0   0.0   ⋯   │ -│   (5)   0.0   0.0   0.0   0.0   ⋯   │ -│   (6)   0.0   0.0   0.0   0.0   ⋯   │ -│   (7)   0.0   0.0   0.0   0.0   ⋯   │ -│   (8)   0.0   0.0   0.0   0.0   ⋯   │ -│   (9)   0.0   0.0   0.0   0.0   ⋯   │ -│   (10)   0.0   0.0   0.0   0.0   ⋯   │ -│   (11)   0.0   0.0   0.0   0.0   ⋯   │ -│   (12)   0.0   0.0   0.0   0.0   ⋯   │ -│   (13)   0.0   0.0   0.0   0.0   ⋯   │ -│   (14)   0.0   0.0   0.0   0.0   ⋯   │ -│   (15)   0.0   0.0   0.0   0.0   ⋯   │ -│   (16)   0.0   0.0   0.0   0.0   ⋯   │ -│   (17)   0.0   0.0   0.0   0.0   ⋯   │ -│   (18)   0.0   0.0   0.0   0.0   ⋯   │ -│   (19)   0.0   0.0   0.0   0.0   ⋯   │ -│   (20)   0.0   0.0   0.0   0.0   ⋯   │ -│   (21)   0.0   0.0   0.0   0.0   ⋯   │ -│   (22)   0.0   0.0   0.0   0.0   ⋯   │ -│   (23)   0.0   0.0   0.0   0.0   ⋯   │ -│   (24)   0.0   0.0   0.0   0.0   ⋯   │ -│   (25)   0.0   0.0   0.0   0.0   ⋯   │ -│   (26)   0.0   0.0   0.0   0.0   ⋯   │ -│   (27)   0.0   0.0   0.0   0.0   ⋯   │ -│   (28)   0.0   0.0   0.0   0.0   ⋯   │ -│   (29)   0.0   0.0   0.0   0.0   ⋯   │ -│   (30)   0.0   0.0   0.0   0.0   ⋯   │ -│   (31)   0.0   0.0   0.0   0.0   ⋯   │ -│   (32)   0.0   0.0   0.0   0.0   ⋯   │ -│   (33)   0.0   0.0   0.0   0.0   ⋯   │ -│   (34)   0.0   0.0   0.0   0.0   ⋯   │ -│   (35)   0.0   0.0   0.0   0.0   ⋯   │ -│   (36)   0.0   0.0   0.0   0.0   ⋯   │ -│   (37)   0.0   0.0   0.0   0.0   ⋯   │ -│   (38)   0.0   0.0   0.0   0.0   ⋯   │ -│   (39)   0.0   0.0   0.0   0.0   ⋯   │ -│   (40)   0.0   0.0   0.0   0.0   ⋯   │ -│   (41)   0.0   0.0   0.0   0.0   ⋯   │ -│   (42)   0.0   0.0   0.0   0.0   ⋯   │ -│   (43)   0.0   0.0   0.0   0.0   ⋯   │ -│   (44)   0.0   0.0   0.0   0.0   ⋯   │ -│   (45)   0.0   0.0   0.0   0.0   ⋯   │ -│   (46)   0.0   0.0   0.0   0.0   ⋯   │ -│   (47)   0.0   0.0   0.0   0.0   ⋯   │ -│   (48)   0.0   0.0   0.0   0.0   ⋯   │ -│   (49)   0.0   0.0   0.0   0.0   ⋯   │ -│   (50)   0.0   0.0   0.0   0.0   ⋯   │ -│     ⋮   ⋮   ⋮   ⋮   ⋱   │ -│   │ -│ │ -╰─────────────────────────── 120 × 300  ───╯ +╭──── Matrix {Float64}  ───────────────────╮ +│ │ +│   │ +│     (1)   (2)   (3)   (4)   (300)   │ +│   │ +│   (1)   0.0   0.0   0.0   0.0   ⋯   │ +│   (2)   0.0   0.0   0.0   0.0   ⋯   │ +│   (3)   0.0   0.0   0.0   0.0   ⋯   │ +│   (4)   0.0   0.0   0.0   0.0   ⋯   │ +│   (5)   0.0   0.0   0.0   0.0   ⋯   │ +│   (6)   0.0   0.0   0.0   0.0   ⋯   │ +│   (7)   0.0   0.0   0.0   0.0   ⋯   │ +│   (8)   0.0   0.0   0.0   0.0   ⋯   │ +│   (9)   0.0   0.0   0.0   0.0   ⋯   │ +│   (10)   0.0   0.0   0.0   0.0   ⋯   │ +│   (11)   0.0   0.0   0.0   0.0   ⋯   │ +│   (12)   0.0   0.0   0.0   0.0   ⋯   │ +│   (13)   0.0   0.0   0.0   0.0   ⋯   │ +│   (14)   0.0   0.0   0.0   0.0   ⋯   │ +│   (15)   0.0   0.0   0.0   0.0   ⋯   │ +│   (16)   0.0   0.0   0.0   0.0   ⋯   │ +│   (17)   0.0   0.0   0.0   0.0   ⋯   │ +│   (18)   0.0   0.0   0.0   0.0   ⋯   │ +│   (19)   0.0   0.0   0.0   0.0   ⋯   │ +│   (20)   0.0   0.0   0.0   0.0   ⋯   │ +│   (21)   0.0   0.0   0.0   0.0   ⋯   │ +│   (22)   0.0   0.0   0.0   0.0   ⋯   │ +│   (23)   0.0   0.0   0.0   0.0   ⋯   │ +│   (24)   0.0   0.0   0.0   0.0   ⋯   │ +│   (25)   0.0   0.0   0.0   0.0   ⋯   │ +│   (26)   0.0   0.0   0.0   0.0   ⋯   │ +│   (27)   0.0   0.0   0.0   0.0   ⋯   │ +│   (28)   0.0   0.0   0.0   0.0   ⋯   │ +│   (29)   0.0   0.0   0.0   0.0   ⋯   │ +│   (30)   0.0   0.0   0.0   0.0   ⋯   │ +│   (31)   0.0   0.0   0.0   0.0   ⋯   │ +│   (32)   0.0   0.0   0.0   0.0   ⋯   │ +│   (33)   0.0   0.0   0.0   0.0   ⋯   │ +│   (34)   0.0   0.0   0.0   0.0   ⋯   │ +│   (35)   0.0   0.0   0.0   0.0   ⋯   │ +│   (36)   0.0   0.0   0.0   0.0   ⋯   │ +│   (37)   0.0   0.0   0.0   0.0   ⋯   │ +│   (38)   0.0   0.0   0.0   0.0   ⋯   │ +│   (39)   0.0   0.0   0.0   0.0   ⋯   │ +│   (40)   0.0   0.0   0.0   0.0   ⋯   │ +│   (41)   0.0   0.0   0.0   0.0   ⋯   │ +│   (42)   0.0   0.0   0.0   0.0   ⋯   │ +│   (43)   0.0   0.0   0.0   0.0   ⋯   │ +│   (44)   0.0   0.0   0.0   0.0   ⋯   │ +│   (45)   0.0   0.0   0.0   0.0   ⋯   │ +│   (46)   0.0   0.0   0.0   0.0   ⋯   │ +│   (47)   0.0   0.0   0.0   0.0   ⋯   │ +│   (48)   0.0   0.0   0.0   0.0   ⋯   │ +│   (49)   0.0   0.0   0.0   0.0   ⋯   │ +│   (50)   0.0   0.0   0.0   0.0   ⋯   │ +│     ⋮   ⋮   ⋮   ⋮   ⋱   │ +│   │ +│ │ +╰─────────────────────────── 120 × 300  ───╯ diff --git a/test/txtfiles/termshow_5.txt b/test/txtfiles/termshow_5.txt index 9775e8185..15bf4e420 100644 --- a/test/txtfiles/termshow_5.txt +++ b/test/txtfiles/termshow_5.txt @@ -1,56 +1,56 @@ ╭────────────────────╮ -│ │ -│   (1)   0.0   │ -│   (2)   0.0   │ -│   (3)   0.0   │ -│   (4)   0.0   │ -│   (5)   0.0   │ -│   (6)   0.0   │ -│   (7)   0.0   │ -│   (8)   0.0   │ -│   (9)   0.0   │ -│   (10)   0.0   │ -│   (11)   0.0   │ -│   (12)   0.0   │ -│   (13)   0.0   │ -│   (14)   0.0   │ -│   (15)   0.0   │ -│   (16)   0.0   │ -│   (17)   0.0   │ -│   (18)   0.0   │ -│   (19)   0.0   │ -│   (20)   0.0   │ -│   (21)   0.0   │ -│   (22)   0.0   │ -│   (23)   0.0   │ -│   (24)   0.0   │ -│   (25)   0.0   │ -│   (26)   0.0   │ -│   (27)   0.0   │ -│   (28)   0.0   │ -│   (29)   0.0   │ -│   (30)   0.0   │ -│   (31)   0.0   │ -│   (32)   0.0   │ -│   (33)   0.0   │ -│   (34)   0.0   │ -│   (35)   0.0   │ -│   (36)   0.0   │ -│   (37)   0.0   │ -│   (38)   0.0   │ -│   (39)   0.0   │ -│   (40)   0.0   │ -│   (41)   0.0   │ -│   (42)   0.0   │ -│   (43)   0.0   │ -│   (44)   0.0   │ -│   (45)   0.0   │ -│   (46)   0.0   │ -│   (47)   0.0   │ -│   (48)   0.0   │ -│   (49)   0.0   │ -│   (50)   0.0   │ -│     ⋮   │ -│   │ -│ │ -╰────── 200 items ───╯ +│ │ +│   (1)   0.0   │ +│   (2)   0.0   │ +│   (3)   0.0   │ +│   (4)   0.0   │ +│   (5)   0.0   │ +│   (6)   0.0   │ +│   (7)   0.0   │ +│   (8)   0.0   │ +│   (9)   0.0   │ +│   (10)   0.0   │ +│   (11)   0.0   │ +│   (12)   0.0   │ +│   (13)   0.0   │ +│   (14)   0.0   │ +│   (15)   0.0   │ +│   (16)   0.0   │ +│   (17)   0.0   │ +│   (18)   0.0   │ +│   (19)   0.0   │ +│   (20)   0.0   │ +│   (21)   0.0   │ +│   (22)   0.0   │ +│   (23)   0.0   │ +│   (24)   0.0   │ +│   (25)   0.0   │ +│   (26)   0.0   │ +│   (27)   0.0   │ +│   (28)   0.0   │ +│   (29)   0.0   │ +│   (30)   0.0   │ +│   (31)   0.0   │ +│   (32)   0.0   │ +│   (33)   0.0   │ +│   (34)   0.0   │ +│   (35)   0.0   │ +│   (36)   0.0   │ +│   (37)   0.0   │ +│   (38)   0.0   │ +│   (39)   0.0   │ +│   (40)   0.0   │ +│   (41)   0.0   │ +│   (42)   0.0   │ +│   (43)   0.0   │ +│   (44)   0.0   │ +│   (45)   0.0   │ +│   (46)   0.0   │ +│   (47)   0.0   │ +│   (48)   0.0   │ +│   (49)   0.0   │ +│   (50)   0.0   │ +│     ⋮   │ +│   │ +│ │ +╰────── 200 items ───╯ diff --git a/test/txtfiles/termshow_6.txt b/test/txtfiles/termshow_6.txt index 263354f9e..0d8d027ea 100644 --- a/test/txtfiles/termshow_6.txt +++ b/test/txtfiles/termshow_6.txt @@ -1,37 +1,37 @@ -╭──── Array {Float64, 3}  ────────╮ -│ │ -│ ╭─────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   │ │ -│ │   (2)   0.0   0.0   0.0   │ │ -│ │   (3)   0.0   0.0   0.0   │ │ -│ │   │ │ -│ ╰─────────────── [:, :, 1] ───╯ │ -│ │ -│ │ -│ ╭─────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   │ │ -│ │   (2)   0.0   0.0   0.0   │ │ -│ │   (3)   0.0   0.0   0.0   │ │ -│ │   │ │ -│ ╰─────────────── [:, :, 2] ───╯ │ -│ │ -│ │ -│ ╭─────────────────────────────╮ │ -│ │   │ │ -│ │     (1)   (2)   (3)   │ │ -│ │   │ │ -│ │   (1)   0.0   0.0   0.0   │ │ -│ │   (2)   0.0   0.0   0.0   │ │ -│ │   (3)   0.0   0.0   0.0   │ │ -│ │   │ │ -│ ╰─────────────── [:, :, 3] ───╯ │ -│ │ -│ │ -│ │ -╰─────────────────── 3 × 3 × 3 ───╯ +╭──── Array {Float64, 3}  ────────╮ +│ │ +│ ╭─────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   │ │ +│ │   (2)   0.0   0.0   0.0   │ │ +│ │   (3)   0.0   0.0   0.0   │ │ +│ │   │ │ +│ ╰─────────────── [:, :, 1] ───╯ │ +│ │ +│ │ +│ ╭─────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   │ │ +│ │   (2)   0.0   0.0   0.0   │ │ +│ │   (3)   0.0   0.0   0.0   │ │ +│ │   │ │ +│ ╰─────────────── [:, :, 2] ───╯ │ +│ │ +│ │ +│ ╭─────────────────────────────╮ │ +│ │   │ │ +│ │     (1)   (2)   (3)   │ │ +│ │   │ │ +│ │   (1)   0.0   0.0   0.0   │ │ +│ │   (2)   0.0   0.0   0.0   │ │ +│ │   (3)   0.0   0.0   0.0   │ │ +│ │   │ │ +│ ╰─────────────── [:, :, 3] ───╯ │ +│ │ +│ │ +│ │ +╰─────────────────── 3 × 3 × 3 ───╯ diff --git a/test/txtfiles/termshow_7.txt b/test/txtfiles/termshow_7.txt index 4781691dc..89a43b0b1 100644 --- a/test/txtfiles/termshow_7.txt +++ b/test/txtfiles/termshow_7.txt @@ -1,12 +1,8 @@ - ╭──── Function: clear ─────────────────────────────╮ - │ │ - │ (1)  clear() │ - │ (2)  clear(io::IO) │ - │ │ - ╰──────────────────────────────────── 2 methods ───╯ -━━━━━━━━━━━━━━━━━━━━━━ Docstring ━━━━━━━━━━━━━━━━━━━━━━ - ┌─────────────────────────────────────┐ - │ clear(io::IO = stdout)  │ - └─────────────────────────────────────┘ - - Clear terminal from anything printed in the REPL. + ╭──── Function: fn ────────────────────────────────╮ + │ │ + │ (1)  fn(x::Int64) │ + │ (2)  fn(s::String) │ + │ │ + ╰──────────────────────────────────── 2 methods ───╯ +━━━━━━━━━━━━━━━━━━━━━━ Docstring ━━━━━━━━━━━━━━━━━━━━━━ + test function diff --git a/test/txtfiles/termshow_8.txt b/test/txtfiles/termshow_8.txt index 47daba0a8..f5d465a86 100644 --- a/test/txtfiles/termshow_8.txt +++ b/test/txtfiles/termshow_8.txt @@ -1,6 +1,7 @@ -╭──────────────────────────────────────────╮ -│ x / y + √9 │ -│ ────────────────────────────────────── │ -│ head::Symbol│ call │ -│ args::Vector│ Any[:+, :(x / y), :(√9)] │ -╰───────────────────────────────── Expr ───╯ +╭───────────────────────────────────────────╮ +│ x / y + √9 │ +│ ─────────────────────────────────────── │ +│  head::Symbol  call   │ +│  args::Vector Any[:+, :(x / y), :(√9)]  │ +│   │ +╰────────────────────────────────── Expr ───╯ diff --git a/test/txtfiles/termshow_9.txt b/test/txtfiles/termshow_9.txt index 66139479b..a966c25e6 100644 --- a/test/txtfiles/termshow_9.txt +++ b/test/txtfiles/termshow_9.txt @@ -1,15 +1,15 @@ ╭────────────────────╮ -│ │ -│   (1)   0.0   │ -│   (2)   0.0   │ -│   (3)   0.0   │ -│   (4)   0.0   │ -│   (5)   0.0   │ -│   (6)   0.0   │ -│   (7)   0.0   │ -│   (8)   0.0   │ -│   (9)   0.0   │ -│   (10)   0.0   │ -│   │ -│ │ -╰─────── 10 items ───╯ +│ │ +│   (1)   0.0   │ +│   (2)   0.0   │ +│   (3)   0.0   │ +│   (4)   0.0   │ +│   (5)   0.0   │ +│   (6)   0.0   │ +│   (7)   0.0   │ +│   (8)   0.0   │ +│   (9)   0.0   │ +│   (10)   0.0   │ +│   │ +│ │ +╰─────── 10 items ───╯ diff --git a/test/txtfiles/termshow_panel.txt b/test/txtfiles/termshow_panel.txt deleted file mode 100644 index 4a791e214..000000000 --- a/test/txtfiles/termshow_panel.txt +++ /dev/null @@ -1,6 +0,0 @@ -╭────────────────────────────────╮ -│ width::Int64│ 10 │ -│ height::Int64│ 50 │ -│ mass::Float64│ 5000.0 │ -│ manufacturer::String│ NASA │ -╰───────────────────── Rocket ───╯ diff --git a/test/txtfiles/tree_1.txt b/test/txtfiles/tree_1.txt deleted file mode 100644 index fdd3dadda..000000000 --- a/test/txtfiles/tree_1.txt +++ /dev/null @@ -1,6 +0,0 @@ - tree -━━━━━━ - │  - └── nestedasdasdsadasdasdsadsadasdasdasdsadas... -  ├── n1: 1 -  └── n2: 2 \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_1.txt b/test/txtfiles/tree_1_1_1.txt new file mode 100644 index 000000000..93dcdd555 --- /dev/null +++ b/test/txtfiles/tree_1_1_1.txt @@ -0,0 +1,8 @@ +tree_1_1_1 + └─ nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfdsfsd +fd ⇒ Dict("n1" => 1, "n2" => 2) + + ├─ n1 ⇒ 1 + + └─ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_10.txt b/test/txtfiles/tree_1_1_10.txt new file mode 100644 index 000000000..f5bf6e25f --- /dev/null +++ b/test/txtfiles/tree_1_1_10.txt @@ -0,0 +1,2 @@ +tree_1_1_10 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_11.txt b/test/txtfiles/tree_1_1_11.txt new file mode 100644 index 000000000..83afd1386 --- /dev/null +++ b/test/txtfiles/tree_1_1_11.txt @@ -0,0 +1,2 @@ +tree_1_1_11 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_12.txt b/test/txtfiles/tree_1_1_12.txt new file mode 100644 index 000000000..bfe0c9f96 --- /dev/null +++ b/test/txtfiles/tree_1_1_12.txt @@ -0,0 +1,7 @@ +tree_1_1_12 + ├─ 1 ⇒ print + └─ 2 ⇒ :((x, y)) + └─ 1 ⇒ (x, y) + ├─ 1 ⇒ x + └─ 2 ⇒ y + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_2.txt b/test/txtfiles/tree_1_1_2.txt new file mode 100644 index 000000000..77f2bff56 --- /dev/null +++ b/test/txtfiles/tree_1_1_2.txt @@ -0,0 +1,8 @@ +tree_1_1_2 + ├─ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + │ ├─ n1 ⇒ a + │ └─ n2 ⇒ 2 + └─ nested ⇒ Dict("n1" => 1, "n2" => 2) + ├─ n1 ⇒ 1 + └─ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_3.txt b/test/txtfiles/tree_1_1_3.txt new file mode 100644 index 000000000..f6ee913af --- /dev/null +++ b/test/txtfiles/tree_1_1_3.txt @@ -0,0 +1,10 @@ +tree_1_1_3 + ├─ leaf ⇒ 2 + ├─ nested ⇒ Dict("n1" => 1, "n2" => 2) + │ ├─ n1 ⇒ 1 + │ └─ n2 ⇒ 2 + ├─ canopy ⇒ test + ├─ leafme ⇒ v + ├─ ["a"] ⇒ test + └─ leaf2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_4.txt b/test/txtfiles/tree_1_1_4.txt new file mode 100644 index 000000000..f33e67e18 --- /dev/null +++ b/test/txtfiles/tree_1_1_4.txt @@ -0,0 +1,23 @@ +tree_1_1_4 + ├─ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + │ ├─ n1 ⇒ a + │ └─ n2 ⇒ 2 + └─ nested ⇒ Dict("n3" => 3, "n2" => Int64, "deeper" + => Dict("aleaf" => "unbeliefable", "leaflet" +  => "level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3")) + ├─ n3 ⇒ 3 + ├─ n2 ⇒ Int64 + └─ deeper ⇒ Dict("aleaf" => "unbeliefable", "leaflet" + => "level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3") + ├─ aleaf ⇒ unbeliefable + └─ leaflet ⇒ level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_5.txt b/test/txtfiles/tree_1_1_5.txt new file mode 100644 index 000000000..effe7a727 --- /dev/null +++ b/test/txtfiles/tree_1_1_5.txt @@ -0,0 +1,20 @@ +tree_1_1_5 + ├─ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + │ ├─ n1 ⇒ a + │ └─ n2 ⇒ 2 + └─ nested ⇒ Dict("adict" => Dict("x" => 2), "n3" => + 3, "n2" => Int64, "deeper" => Dict("sodeep" + => Dict("a" => 4), "aleaf" => "unbeliefable" + , "leaflet" => "level 3")) + ├─ adict ⇒ Dict("x" => 2) + │ └─ x ⇒ 2 + ├─ n3 ⇒ 3 + ├─ n2 ⇒ Int64 + └─ deeper ⇒ Dict("sodeep" => Dict("a" => 4), "aleaf" + => "unbeliefable", "leaflet" => "level + 3") + ├─ sodeep ⇒ Dict("a" => 4) + │ └─ a ⇒ 4 + ├─ aleaf ⇒ unbeliefable + └─ leaflet ⇒ level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_6.txt b/test/txtfiles/tree_1_1_6.txt new file mode 100644 index 000000000..bcd581e54 --- /dev/null +++ b/test/txtfiles/tree_1_1_6.txt @@ -0,0 +1,8 @@ +tree_1_1_6 + ├─ 3 ⇒ OrderedDict(3 => 8, 1 => "a") + │ ├─ 3 ⇒ 8 + │ └─ 1 ⇒ a + └─ 2 ⇒ OrderedDict(3 => 8, 1 => "a") + ├─ 3 ⇒ 8 + └─ 1 ⇒ a + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_7.txt b/test/txtfiles/tree_1_1_7.txt new file mode 100644 index 000000000..1b3f43f35 --- /dev/null +++ b/test/txtfiles/tree_1_1_7.txt @@ -0,0 +1,7 @@ +tree_1_1_7 + ├─ 2 ⇒ 1 + └─ 3 ⇒ OrderedDict(4 => 2, "a" => 2, "b" => 1) + ├─ 4 ⇒ 2 + ├─ a ⇒ 2 + └─ b ⇒ 1 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_8.txt b/test/txtfiles/tree_1_1_8.txt new file mode 100644 index 000000000..8c8a16179 --- /dev/null +++ b/test/txtfiles/tree_1_1_8.txt @@ -0,0 +1,8 @@ +tree_1_1_8 + ├─ 1 ⇒ 1 + ├─ 2 ⇒ 2 + └─ 3 ⇒ [2, 3, 4] + ├─ 1 ⇒ 2 + ├─ 2 ⇒ 3 + └─ 3 ⇒ 4 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_1_9.txt b/test/txtfiles/tree_1_1_9.txt new file mode 100644 index 000000000..40d610988 --- /dev/null +++ b/test/txtfiles/tree_1_1_9.txt @@ -0,0 +1,26 @@ +tree_1_1_9 + ├─ 1 ⇒ 1 + ├─ 2 ⇒ Any[2, [3, 4], "aaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + │ ├─ 1 ⇒ 2 + │ ├─ 2 ⇒ [3, 4] + │ │ ├─ 1 ⇒ 3 + │ │ └─ 2 ⇒ 4 + │ └─ 3 ⇒ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaa + ├─ 3 ⇒ c + └─ 4 ⇒ OrderedDict(2 => "a", 1 => :ok, "a" => + 2, :test => [1, 2]) + ├─ 2 ⇒ a + ├─ 1 ⇒ ok + ├─ a ⇒ 2 + └─ test ⇒ [1, 2] + ├─ 1 ⇒ 1 + └─ 2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_1.txt b/test/txtfiles/tree_1_2_1.txt new file mode 100644 index 000000000..13a36ceb8 --- /dev/null +++ b/test/txtfiles/tree_1_2_1.txt @@ -0,0 +1,8 @@ +tree_1_2_1 + ┗━━━ nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfdsf +sdfd ⇒ Dict("n1" => 1, "n2" => 2) + + ┣━━━ n1 ⇒ 1 + + ┗━━━ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_10.txt b/test/txtfiles/tree_1_2_10.txt new file mode 100644 index 000000000..a5f31393d --- /dev/null +++ b/test/txtfiles/tree_1_2_10.txt @@ -0,0 +1,2 @@ +tree_1_2_10 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_11.txt b/test/txtfiles/tree_1_2_11.txt new file mode 100644 index 000000000..ee47dd3fa --- /dev/null +++ b/test/txtfiles/tree_1_2_11.txt @@ -0,0 +1,2 @@ +tree_1_2_11 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_12.txt b/test/txtfiles/tree_1_2_12.txt new file mode 100644 index 000000000..37fcb5658 --- /dev/null +++ b/test/txtfiles/tree_1_2_12.txt @@ -0,0 +1,7 @@ +tree_1_2_12 + ┣━━━ 1 ⇒ print + ┗━━━ 2 ⇒ :((x, y)) + ┗━━━ 1 ⇒ (x, y) + ┣━━━ 1 ⇒ x + ┗━━━ 2 ⇒ y + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_2.txt b/test/txtfiles/tree_1_2_2.txt new file mode 100644 index 000000000..bf56c0341 --- /dev/null +++ b/test/txtfiles/tree_1_2_2.txt @@ -0,0 +1,8 @@ +tree_1_2_2 + ┣━━━ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + ┃ ┣━━━ n1 ⇒ a + ┃ ┗━━━ n2 ⇒ 2 + ┗━━━ nested ⇒ Dict("n1" => 1, "n2" => 2) + ┣━━━ n1 ⇒ 1 + ┗━━━ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_3.txt b/test/txtfiles/tree_1_2_3.txt new file mode 100644 index 000000000..014756f6a --- /dev/null +++ b/test/txtfiles/tree_1_2_3.txt @@ -0,0 +1,10 @@ +tree_1_2_3 + ┣━━━ leaf ⇒ 2 + ┣━━━ nested ⇒ Dict("n1" => 1, "n2" => 2) + ┃ ┣━━━ n1 ⇒ 1 + ┃ ┗━━━ n2 ⇒ 2 + ┣━━━ canopy ⇒ test + ┣━━━ leafme ⇒ v + ┣━━━ ["a"] ⇒ test + ┗━━━ leaf2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_4.txt b/test/txtfiles/tree_1_2_4.txt new file mode 100644 index 000000000..a4909ef89 --- /dev/null +++ b/test/txtfiles/tree_1_2_4.txt @@ -0,0 +1,26 @@ +tree_1_2_4 + ┣━━━ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + ┃ ┣━━━ n1 ⇒ a + ┃ ┗━━━ n2 ⇒ 2 + ┗━━━ nested ⇒ Dict("n3" => 3, "n2" => Int64, "deeper" + => Dict("aleaf" => "unbeliefable", "leaflet" +  => "level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3")) + ┣━━━ n3 ⇒ 3 + ┣━━━ n2 ⇒ Int64 + ┗━━━ deeper ⇒ Dict("aleaf" => "unbeliefable", "leaflet" + => "level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3") + ┣━━━ aleaf ⇒ unbeliefable + ┗━━━ leaflet ⇒ level 3level 3level 3level 3level +3level + 3level 3level 3level 3level 3level +3level + 3level 3level 3level 3level 3level +3level + 3level 3level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_5.txt b/test/txtfiles/tree_1_2_5.txt new file mode 100644 index 000000000..74f585aad --- /dev/null +++ b/test/txtfiles/tree_1_2_5.txt @@ -0,0 +1,20 @@ +tree_1_2_5 + ┣━━━ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + ┃ ┣━━━ n1 ⇒ a + ┃ ┗━━━ n2 ⇒ 2 + ┗━━━ nested ⇒ Dict("adict" => Dict("x" => 2), "n3" => + 3, "n2" => Int64, "deeper" => Dict("sodeep" + => Dict("a" => 4), "aleaf" => "unbeliefable" + , "leaflet" => "level 3")) + ┣━━━ adict ⇒ Dict("x" => 2) + ┃ ┗━━━ x ⇒ 2 + ┣━━━ n3 ⇒ 3 + ┣━━━ n2 ⇒ Int64 + ┗━━━ deeper ⇒ Dict("sodeep" => Dict("a" => 4), "aleaf" + => "unbeliefable", "leaflet" => "level + 3") + ┣━━━ sodeep ⇒ Dict("a" => 4) + ┃ ┗━━━ a ⇒ 4 + ┣━━━ aleaf ⇒ unbeliefable + ┗━━━ leaflet ⇒ level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_6.txt b/test/txtfiles/tree_1_2_6.txt new file mode 100644 index 000000000..8960b3f73 --- /dev/null +++ b/test/txtfiles/tree_1_2_6.txt @@ -0,0 +1,8 @@ +tree_1_2_6 + ┣━━━ 3 ⇒ OrderedDict(3 => 8, 1 => "a") + ┃ ┣━━━ 3 ⇒ 8 + ┃ ┗━━━ 1 ⇒ a + ┗━━━ 2 ⇒ OrderedDict(3 => 8, 1 => "a") + ┣━━━ 3 ⇒ 8 + ┗━━━ 1 ⇒ a + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_7.txt b/test/txtfiles/tree_1_2_7.txt new file mode 100644 index 000000000..8da64001c --- /dev/null +++ b/test/txtfiles/tree_1_2_7.txt @@ -0,0 +1,7 @@ +tree_1_2_7 + ┣━━━ 2 ⇒ 1 + ┗━━━ 3 ⇒ OrderedDict(4 => 2, "a" => 2, "b" => 1) + ┣━━━ 4 ⇒ 2 + ┣━━━ a ⇒ 2 + ┗━━━ b ⇒ 1 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_8.txt b/test/txtfiles/tree_1_2_8.txt new file mode 100644 index 000000000..b39843cad --- /dev/null +++ b/test/txtfiles/tree_1_2_8.txt @@ -0,0 +1,8 @@ +tree_1_2_8 + ┣━━━ 1 ⇒ 1 + ┣━━━ 2 ⇒ 2 + ┗━━━ 3 ⇒ [2, 3, 4] + ┣━━━ 1 ⇒ 2 + ┣━━━ 2 ⇒ 3 + ┗━━━ 3 ⇒ 4 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_2_9.txt b/test/txtfiles/tree_1_2_9.txt new file mode 100644 index 000000000..73dbdd289 --- /dev/null +++ b/test/txtfiles/tree_1_2_9.txt @@ -0,0 +1,26 @@ +tree_1_2_9 + ┣━━━ 1 ⇒ 1 + ┣━━━ 2 ⇒ Any[2, [3, 4], "aaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + ┃ ┣━━━ 1 ⇒ 2 + ┃ ┣━━━ 2 ⇒ [3, 4] + ┃ ┃ ┣━━━ 1 ⇒ 3 + ┃ ┃ ┗━━━ 2 ⇒ 4 + ┃ ┗━━━ 3 ⇒ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaa + ┣━━━ 3 ⇒ c + ┗━━━ 4 ⇒ OrderedDict(2 => "a", 1 => :ok, "a" => + 2, :test => [1, 2]) + ┣━━━ 2 ⇒ a + ┣━━━ 1 ⇒ ok + ┣━━━ a ⇒ 2 + ┗━━━ test ⇒ [1, 2] + ┣━━━ 1 ⇒ 1 + ┗━━━ 2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_1.txt b/test/txtfiles/tree_1_3_1.txt new file mode 100644 index 000000000..52b2cb9c9 --- /dev/null +++ b/test/txtfiles/tree_1_3_1.txt @@ -0,0 +1,8 @@ +tree_1_3_1 + `---- nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfds +fsdfd => Dict("n1" => 1, "n2" => 2) + + +---- n1 => 1 + + `---- n2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_10.txt b/test/txtfiles/tree_1_3_10.txt new file mode 100644 index 000000000..3f0f30fee --- /dev/null +++ b/test/txtfiles/tree_1_3_10.txt @@ -0,0 +1,2 @@ +tree_1_3_10 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_11.txt b/test/txtfiles/tree_1_3_11.txt new file mode 100644 index 000000000..3c2d36419 --- /dev/null +++ b/test/txtfiles/tree_1_3_11.txt @@ -0,0 +1,2 @@ +tree_1_3_11 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_12.txt b/test/txtfiles/tree_1_3_12.txt new file mode 100644 index 000000000..8a6107628 --- /dev/null +++ b/test/txtfiles/tree_1_3_12.txt @@ -0,0 +1,7 @@ +tree_1_3_12 + +---- 1 => print + `---- 2 => :((x, y)) + `---- 1 => (x, y) + +---- 1 => x + `---- 2 => y + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_2.txt b/test/txtfiles/tree_1_3_2.txt new file mode 100644 index 000000000..a4e3f9040 --- /dev/null +++ b/test/txtfiles/tree_1_3_2.txt @@ -0,0 +1,8 @@ +tree_1_3_2 + +---- nested2 => Dict("n1" => "a", "n2" => 2) + | +---- n1 => a + | `---- n2 => 2 + `---- nested => Dict("n1" => 1, "n2" => 2) + +---- n1 => 1 + `---- n2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_3.txt b/test/txtfiles/tree_1_3_3.txt new file mode 100644 index 000000000..6c6c3af93 --- /dev/null +++ b/test/txtfiles/tree_1_3_3.txt @@ -0,0 +1,10 @@ +tree_1_3_3 + +---- leaf => 2 + +---- nested => Dict("n1" => 1, "n2" => 2) + | +---- n1 => 1 + | `---- n2 => 2 + +---- canopy => test + +---- leafme => v + +---- ["a"] => test + `---- leaf2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_4.txt b/test/txtfiles/tree_1_3_4.txt new file mode 100644 index 000000000..ce22da3cb --- /dev/null +++ b/test/txtfiles/tree_1_3_4.txt @@ -0,0 +1,26 @@ +tree_1_3_4 + +---- nested2 => Dict("n1" => "a", "n2" => 2) + | +---- n1 => a + | `---- n2 => 2 + `---- nested => Dict("n3" => 3, "n2" => Int64, "deeper" + => Dict("aleaf" => "unbeliefable", "leaflet" +  => "level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3")) + +---- n3 => 3 + +---- n2 => Int64 + `---- deeper => Dict("aleaf" => "unbeliefable", "leaflet" + => "level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3") + +---- aleaf => unbeliefable + `---- leaflet => level 3level 3level 3level +3level 3level + 3level 3level 3level 3level 3level + 3level + 3level 3level 3level 3level 3level + 3level + 3level 3level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_5.txt b/test/txtfiles/tree_1_3_5.txt new file mode 100644 index 000000000..c0de41189 --- /dev/null +++ b/test/txtfiles/tree_1_3_5.txt @@ -0,0 +1,20 @@ +tree_1_3_5 + +---- nested2 => Dict("n1" => "a", "n2" => 2) + | +---- n1 => a + | `---- n2 => 2 + `---- nested => Dict("adict" => Dict("x" => 2), "n3" => + 3, "n2" => Int64, "deeper" => Dict("sodeep" + => Dict("a" => 4), "aleaf" => "unbeliefable" + , "leaflet" => "level 3")) + +---- adict => Dict("x" => 2) + | `---- x => 2 + +---- n3 => 3 + +---- n2 => Int64 + `---- deeper => Dict("sodeep" => Dict("a" => 4), "aleaf" + => "unbeliefable", "leaflet" => "level + 3") + +---- sodeep => Dict("a" => 4) + | `---- a => 4 + +---- aleaf => unbeliefable + `---- leaflet => level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_6.txt b/test/txtfiles/tree_1_3_6.txt new file mode 100644 index 000000000..f5e4b4ecc --- /dev/null +++ b/test/txtfiles/tree_1_3_6.txt @@ -0,0 +1,8 @@ +tree_1_3_6 + +---- 3 => OrderedDict(3 => 8, 1 => "a") + | +---- 3 => 8 + | `---- 1 => a + `---- 2 => OrderedDict(3 => 8, 1 => "a") + +---- 3 => 8 + `---- 1 => a + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_7.txt b/test/txtfiles/tree_1_3_7.txt new file mode 100644 index 000000000..2bff133f2 --- /dev/null +++ b/test/txtfiles/tree_1_3_7.txt @@ -0,0 +1,7 @@ +tree_1_3_7 + +---- 2 => 1 + `---- 3 => OrderedDict(4 => 2, "a" => 2, "b" => 1) + +---- 4 => 2 + +---- a => 2 + `---- b => 1 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_8.txt b/test/txtfiles/tree_1_3_8.txt new file mode 100644 index 000000000..5f1d16cb4 --- /dev/null +++ b/test/txtfiles/tree_1_3_8.txt @@ -0,0 +1,8 @@ +tree_1_3_8 + +---- 1 => 1 + +---- 2 => 2 + `---- 3 => [2, 3, 4] + +---- 1 => 2 + +---- 2 => 3 + `---- 3 => 4 + \ No newline at end of file diff --git a/test/txtfiles/tree_1_3_9.txt b/test/txtfiles/tree_1_3_9.txt new file mode 100644 index 000000000..d078d9fbe --- /dev/null +++ b/test/txtfiles/tree_1_3_9.txt @@ -0,0 +1,26 @@ +tree_1_3_9 + +---- 1 => 1 + +---- 2 => Any[2, [3, 4], "aaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + | +---- 1 => 2 + | +---- 2 => [3, 4] + | | +---- 1 => 3 + | | `---- 2 => 4 + | `---- 3 => aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaa + +---- 3 => c + `---- 4 => OrderedDict(2 => "a", 1 => :ok, "a" => + 2, :test => [1, 2]) + +---- 2 => a + +---- 1 => ok + +---- a => 2 + `---- test => [1, 2] + +---- 1 => 1 + `---- 2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2.txt b/test/txtfiles/tree_2.txt deleted file mode 100644 index d74e91bc5..000000000 --- a/test/txtfiles/tree_2.txt +++ /dev/null @@ -1,9 +0,0 @@ - tree -━━━━━━ - │  - ├── nested2 - │ ├── n1: a - │ └── n2: 2 - └── nested -  ├── n1: 1 -  └── n2: 2 \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_1.txt b/test/txtfiles/tree_2_1_1.txt new file mode 100644 index 000000000..387e503f8 --- /dev/null +++ b/test/txtfiles/tree_2_1_1.txt @@ -0,0 +1,8 @@ +tree_2_1_1 + └─ nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfdsfsd +fd ⇒ Dict("n1" => 1, "n2" => 2) + + ├─ n1 ⇒ 1 + + └─ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_10.txt b/test/txtfiles/tree_2_1_10.txt new file mode 100644 index 000000000..ce609ca06 --- /dev/null +++ b/test/txtfiles/tree_2_1_10.txt @@ -0,0 +1,2 @@ +tree_2_1_10 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_11.txt b/test/txtfiles/tree_2_1_11.txt new file mode 100644 index 000000000..577ba2be9 --- /dev/null +++ b/test/txtfiles/tree_2_1_11.txt @@ -0,0 +1,2 @@ +tree_2_1_11 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_12.txt b/test/txtfiles/tree_2_1_12.txt new file mode 100644 index 000000000..5b6e8c91a --- /dev/null +++ b/test/txtfiles/tree_2_1_12.txt @@ -0,0 +1,7 @@ +tree_2_1_12 + ├─ 1 ⇒ print + └─ 2 ⇒ :((x, y)) + └─ 1 ⇒ (x, y) + ├─ 1 ⇒ x + └─ 2 ⇒ y + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_2.txt b/test/txtfiles/tree_2_1_2.txt new file mode 100644 index 000000000..487b51f45 --- /dev/null +++ b/test/txtfiles/tree_2_1_2.txt @@ -0,0 +1,8 @@ +tree_2_1_2 + ├─ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + │ ├─ n1 ⇒ a + │ └─ n2 ⇒ 2 + └─ nested ⇒ Dict("n1" => 1, "n2" => 2) + ├─ n1 ⇒ 1 + └─ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_3.txt b/test/txtfiles/tree_2_1_3.txt new file mode 100644 index 000000000..2834e0586 --- /dev/null +++ b/test/txtfiles/tree_2_1_3.txt @@ -0,0 +1,10 @@ +tree_2_1_3 + ├─ leaf ⇒ 2 + ├─ nested ⇒ Dict("n1" => 1, "n2" => 2) + │ ├─ n1 ⇒ 1 + │ └─ n2 ⇒ 2 + ├─ canopy ⇒ test + ├─ leafme ⇒ v + ├─ ["a"] ⇒ test + └─ leaf2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_4.txt b/test/txtfiles/tree_2_1_4.txt new file mode 100644 index 000000000..fa1a3c155 --- /dev/null +++ b/test/txtfiles/tree_2_1_4.txt @@ -0,0 +1,23 @@ +tree_2_1_4 + ├─ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + │ ├─ n1 ⇒ a + │ └─ n2 ⇒ 2 + └─ nested ⇒ Dict("n3" => 3, "n2" => Int64, "deeper" + => Dict("aleaf" => "unbeliefable", "leaflet" +  => "level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3")) + ├─ n3 ⇒ 3 + ├─ n2 ⇒ Int64 + └─ deeper ⇒ Dict("aleaf" => "unbeliefable", "leaflet" + => "level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3") + ├─ aleaf ⇒ unbeliefable + └─ leaflet ⇒ level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_5.txt b/test/txtfiles/tree_2_1_5.txt new file mode 100644 index 000000000..a908c3001 --- /dev/null +++ b/test/txtfiles/tree_2_1_5.txt @@ -0,0 +1,20 @@ +tree_2_1_5 + ├─ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + │ ├─ n1 ⇒ a + │ └─ n2 ⇒ 2 + └─ nested ⇒ Dict("adict" => Dict("x" => 2), "n3" => + 3, "n2" => Int64, "deeper" => Dict("sodeep" + => Dict("a" => 4), "aleaf" => "unbeliefable" + , "leaflet" => "level 3")) + ├─ adict ⇒ Dict("x" => 2) + │ └─ x ⇒ 2 + ├─ n3 ⇒ 3 + ├─ n2 ⇒ Int64 + └─ deeper ⇒ Dict("sodeep" => Dict("a" => 4), "aleaf" + => "unbeliefable", "leaflet" => "level + 3") + ├─ sodeep ⇒ Dict("a" => 4) + │ └─ a ⇒ 4 + ├─ aleaf ⇒ unbeliefable + └─ leaflet ⇒ level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_6.txt b/test/txtfiles/tree_2_1_6.txt new file mode 100644 index 000000000..f53661481 --- /dev/null +++ b/test/txtfiles/tree_2_1_6.txt @@ -0,0 +1,8 @@ +tree_2_1_6 + ├─ 3 ⇒ OrderedDict(3 => 8, 1 => "a") + │ ├─ 3 ⇒ 8 + │ └─ 1 ⇒ a + └─ 2 ⇒ OrderedDict(3 => 8, 1 => "a") + ├─ 3 ⇒ 8 + └─ 1 ⇒ a + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_7.txt b/test/txtfiles/tree_2_1_7.txt new file mode 100644 index 000000000..8a48eff58 --- /dev/null +++ b/test/txtfiles/tree_2_1_7.txt @@ -0,0 +1,7 @@ +tree_2_1_7 + ├─ 2 ⇒ 1 + └─ 3 ⇒ OrderedDict(4 => 2, "a" => 2, "b" => 1) + ├─ 4 ⇒ 2 + ├─ a ⇒ 2 + └─ b ⇒ 1 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_8.txt b/test/txtfiles/tree_2_1_8.txt new file mode 100644 index 000000000..ca3c49e91 --- /dev/null +++ b/test/txtfiles/tree_2_1_8.txt @@ -0,0 +1,8 @@ +tree_2_1_8 + ├─ 1 ⇒ 1 + ├─ 2 ⇒ 2 + └─ 3 ⇒ [2, 3, 4] + ├─ 1 ⇒ 2 + ├─ 2 ⇒ 3 + └─ 3 ⇒ 4 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_1_9.txt b/test/txtfiles/tree_2_1_9.txt new file mode 100644 index 000000000..cb38525ce --- /dev/null +++ b/test/txtfiles/tree_2_1_9.txt @@ -0,0 +1,26 @@ +tree_2_1_9 + ├─ 1 ⇒ 1 + ├─ 2 ⇒ Any[2, [3, 4], "aaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + │ ├─ 1 ⇒ 2 + │ ├─ 2 ⇒ [3, 4] + │ │ ├─ 1 ⇒ 3 + │ │ └─ 2 ⇒ 4 + │ └─ 3 ⇒ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + │ aaaaaaaaaaaaaaaaaaaaaaaa + ├─ 3 ⇒ c + └─ 4 ⇒ OrderedDict(2 => "a", 1 => :ok, "a" => + 2, :test => [1, 2]) + ├─ 2 ⇒ a + ├─ 1 ⇒ ok + ├─ a ⇒ 2 + └─ test ⇒ [1, 2] + ├─ 1 ⇒ 1 + └─ 2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_1.txt b/test/txtfiles/tree_2_2_1.txt new file mode 100644 index 000000000..c4bdf7203 --- /dev/null +++ b/test/txtfiles/tree_2_2_1.txt @@ -0,0 +1,8 @@ +tree_2_2_1 + ┗━━━ nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfdsf +sdfd ⇒ Dict("n1" => 1, "n2" => 2) + + ┣━━━ n1 ⇒ 1 + + ┗━━━ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_10.txt b/test/txtfiles/tree_2_2_10.txt new file mode 100644 index 000000000..14879efe5 --- /dev/null +++ b/test/txtfiles/tree_2_2_10.txt @@ -0,0 +1,2 @@ +tree_2_2_10 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_11.txt b/test/txtfiles/tree_2_2_11.txt new file mode 100644 index 000000000..40b3c6da1 --- /dev/null +++ b/test/txtfiles/tree_2_2_11.txt @@ -0,0 +1,2 @@ +tree_2_2_11 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_12.txt b/test/txtfiles/tree_2_2_12.txt new file mode 100644 index 000000000..bd4e590e4 --- /dev/null +++ b/test/txtfiles/tree_2_2_12.txt @@ -0,0 +1,7 @@ +tree_2_2_12 + ┣━━━ 1 ⇒ print + ┗━━━ 2 ⇒ :((x, y)) + ┗━━━ 1 ⇒ (x, y) + ┣━━━ 1 ⇒ x + ┗━━━ 2 ⇒ y + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_2.txt b/test/txtfiles/tree_2_2_2.txt new file mode 100644 index 000000000..1a1f44634 --- /dev/null +++ b/test/txtfiles/tree_2_2_2.txt @@ -0,0 +1,8 @@ +tree_2_2_2 + ┣━━━ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + ┃ ┣━━━ n1 ⇒ a + ┃ ┗━━━ n2 ⇒ 2 + ┗━━━ nested ⇒ Dict("n1" => 1, "n2" => 2) + ┣━━━ n1 ⇒ 1 + ┗━━━ n2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_3.txt b/test/txtfiles/tree_2_2_3.txt new file mode 100644 index 000000000..0a3a4acc4 --- /dev/null +++ b/test/txtfiles/tree_2_2_3.txt @@ -0,0 +1,10 @@ +tree_2_2_3 + ┣━━━ leaf ⇒ 2 + ┣━━━ nested ⇒ Dict("n1" => 1, "n2" => 2) + ┃ ┣━━━ n1 ⇒ 1 + ┃ ┗━━━ n2 ⇒ 2 + ┣━━━ canopy ⇒ test + ┣━━━ leafme ⇒ v + ┣━━━ ["a"] ⇒ test + ┗━━━ leaf2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_4.txt b/test/txtfiles/tree_2_2_4.txt new file mode 100644 index 000000000..cedf1f448 --- /dev/null +++ b/test/txtfiles/tree_2_2_4.txt @@ -0,0 +1,26 @@ +tree_2_2_4 + ┣━━━ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + ┃ ┣━━━ n1 ⇒ a + ┃ ┗━━━ n2 ⇒ 2 + ┗━━━ nested ⇒ Dict("n3" => 3, "n2" => Int64, "deeper" + => Dict("aleaf" => "unbeliefable", "leaflet" +  => "level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3")) + ┣━━━ n3 ⇒ 3 + ┣━━━ n2 ⇒ Int64 + ┗━━━ deeper ⇒ Dict("aleaf" => "unbeliefable", "leaflet" + => "level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3") + ┣━━━ aleaf ⇒ unbeliefable + ┗━━━ leaflet ⇒ level 3level 3level 3level 3level +3level + 3level 3level 3level 3level 3level +3level + 3level 3level 3level 3level 3level +3level + 3level 3level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_5.txt b/test/txtfiles/tree_2_2_5.txt new file mode 100644 index 000000000..b1b5987f3 --- /dev/null +++ b/test/txtfiles/tree_2_2_5.txt @@ -0,0 +1,20 @@ +tree_2_2_5 + ┣━━━ nested2 ⇒ Dict("n1" => "a", "n2" => 2) + ┃ ┣━━━ n1 ⇒ a + ┃ ┗━━━ n2 ⇒ 2 + ┗━━━ nested ⇒ Dict("adict" => Dict("x" => 2), "n3" => + 3, "n2" => Int64, "deeper" => Dict("sodeep" + => Dict("a" => 4), "aleaf" => "unbeliefable" + , "leaflet" => "level 3")) + ┣━━━ adict ⇒ Dict("x" => 2) + ┃ ┗━━━ x ⇒ 2 + ┣━━━ n3 ⇒ 3 + ┣━━━ n2 ⇒ Int64 + ┗━━━ deeper ⇒ Dict("sodeep" => Dict("a" => 4), "aleaf" + => "unbeliefable", "leaflet" => "level + 3") + ┣━━━ sodeep ⇒ Dict("a" => 4) + ┃ ┗━━━ a ⇒ 4 + ┣━━━ aleaf ⇒ unbeliefable + ┗━━━ leaflet ⇒ level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_6.txt b/test/txtfiles/tree_2_2_6.txt new file mode 100644 index 000000000..dbc3dda48 --- /dev/null +++ b/test/txtfiles/tree_2_2_6.txt @@ -0,0 +1,8 @@ +tree_2_2_6 + ┣━━━ 3 ⇒ OrderedDict(3 => 8, 1 => "a") + ┃ ┣━━━ 3 ⇒ 8 + ┃ ┗━━━ 1 ⇒ a + ┗━━━ 2 ⇒ OrderedDict(3 => 8, 1 => "a") + ┣━━━ 3 ⇒ 8 + ┗━━━ 1 ⇒ a + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_7.txt b/test/txtfiles/tree_2_2_7.txt new file mode 100644 index 000000000..078b10205 --- /dev/null +++ b/test/txtfiles/tree_2_2_7.txt @@ -0,0 +1,7 @@ +tree_2_2_7 + ┣━━━ 2 ⇒ 1 + ┗━━━ 3 ⇒ OrderedDict([38;2;144;202;249m4 => 2, "a" => 2, "b" => 1) + ┣━━━ 4 ⇒ 2 + ┣━━━ a ⇒ 2 + ┗━━━ b ⇒ 1 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_8.txt b/test/txtfiles/tree_2_2_8.txt new file mode 100644 index 000000000..a90871991 --- /dev/null +++ b/test/txtfiles/tree_2_2_8.txt @@ -0,0 +1,8 @@ +tree_2_2_8 + ┣━━━ 1 ⇒ 1 + ┣━━━ 2 ⇒ 2 + ┗━━━ 3 ⇒ [2, 3, 4] + ┣━━━ 1 ⇒ 2 + ┣━━━ 2 ⇒ 3 + ┗━━━ 3 ⇒ 4 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_2_9.txt b/test/txtfiles/tree_2_2_9.txt new file mode 100644 index 000000000..7ce15be9b --- /dev/null +++ b/test/txtfiles/tree_2_2_9.txt @@ -0,0 +1,26 @@ +tree_2_2_9 + ┣━━━ 1 ⇒ 1 + ┣━━━ 2 ⇒ Any[2, [3, 4], "aaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + ┃ ┣━━━ 1 ⇒ 2 + ┃ ┣━━━ 2 ⇒ [3, 4] + ┃ ┃ ┣━━━ 1 ⇒ 3 + ┃ ┃ ┗━━━ 2 ⇒ 4 + ┃ ┗━━━ 3 ⇒ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ┃ aaaaaaaaaaaaaaaaaaaaaaaa + ┣━━━ 3 ⇒ c + ┗━━━ 4 ⇒ OrderedDict(2 => "a", 1 => :ok, "a" => + 2, :test => [1, 2]) + ┣━━━ 2 ⇒ a + ┣━━━ 1 ⇒ ok + ┣━━━ a ⇒ 2 + ┗━━━ test ⇒ [1, 2] + ┣━━━ 1 ⇒ 1 + ┗━━━ 2 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_1.txt b/test/txtfiles/tree_2_3_1.txt new file mode 100644 index 000000000..894c2b3a9 --- /dev/null +++ b/test/txtfiles/tree_2_3_1.txt @@ -0,0 +1,8 @@ +tree_2_3_1 + `---- nestedasdasdsadasdasdsadsadasdasdasdsadasasdasdassfsdfdsfdsfdsfsdfsdfds +fsdfd => Dict("n1" => 1, "n2" => 2) + + +---- n1 => 1 + + `---- n2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_10.txt b/test/txtfiles/tree_2_3_10.txt new file mode 100644 index 000000000..60e5b1377 --- /dev/null +++ b/test/txtfiles/tree_2_3_10.txt @@ -0,0 +1,2 @@ +tree_2_3_10 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_11.txt b/test/txtfiles/tree_2_3_11.txt new file mode 100644 index 000000000..42059bfb1 --- /dev/null +++ b/test/txtfiles/tree_2_3_11.txt @@ -0,0 +1,2 @@ +tree_2_3_11 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_12.txt b/test/txtfiles/tree_2_3_12.txt new file mode 100644 index 000000000..fc7041198 --- /dev/null +++ b/test/txtfiles/tree_2_3_12.txt @@ -0,0 +1,7 @@ +tree_2_3_12 + +---- 1 => print + `---- 2 => :((x, y)) + `---- 1 => (x, y) + +---- 1 => x + `---- 2 => y + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_2.txt b/test/txtfiles/tree_2_3_2.txt new file mode 100644 index 000000000..5a2a036c5 --- /dev/null +++ b/test/txtfiles/tree_2_3_2.txt @@ -0,0 +1,8 @@ +tree_2_3_2 + +---- nested2 => Dict("n1" => "a", "n2" => 2) + | +---- n1 => a + | `---- n2 => 2 + `---- nested => Dict("n1" => 1, "n2" => 2) + +---- n1 => 1 + `---- n2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_3.txt b/test/txtfiles/tree_2_3_3.txt new file mode 100644 index 000000000..6a6039f99 --- /dev/null +++ b/test/txtfiles/tree_2_3_3.txt @@ -0,0 +1,10 @@ +tree_2_3_3 + +---- leaf => 2 + +---- nested => Dict("n1" => 1, "n2" => 2) + | +---- n1 => 1 + | `---- n2 => 2 + +---- canopy => test + +---- leafme => v + +---- ["a"] => test + `---- leaf2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_4.txt b/test/txtfiles/tree_2_3_4.txt new file mode 100644 index 000000000..74e1e656b --- /dev/null +++ b/test/txtfiles/tree_2_3_4.txt @@ -0,0 +1,26 @@ +tree_2_3_4 + +---- nested2 => Dict("n1" => "a", "n2" => 2) + | +---- n1 => a + | `---- n2 => 2 + `---- nested => Dict("n3" => 3, "n2" => Int64, "deeper" + => Dict("aleaf" => "unbeliefable", "leaflet" +  => "level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3")) + +---- n3 => 3 + +---- n2 => Int64 + `---- deeper => Dict("aleaf" => "unbeliefable", "leaflet" + => "level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3level 3level 3level 3level + 3level 3level 3") + +---- aleaf => unbeliefable + `---- leaflet => level 3level 3level 3level +3level 3level + 3level 3level 3level 3level 3level + 3level + 3level 3level 3level 3level 3level + 3level + 3level 3level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_5.txt b/test/txtfiles/tree_2_3_5.txt new file mode 100644 index 000000000..c60e8b576 --- /dev/null +++ b/test/txtfiles/tree_2_3_5.txt @@ -0,0 +1,20 @@ +tree_2_3_5 + +---- nested2 => Dict("n1" => "a", "n2" => 2) + | +---- n1 => a + | `---- n2 => 2 + `---- nested => Dict("adict" => Dict("x" => 2), "n3" => + 3, "n2" => Int64, "deeper" => Dict("sodeep" + => Dict("a" => 4), "aleaf" => "unbeliefable" + , "leaflet" => "level 3")) + +---- adict => Dict("x" => 2) + | `---- x => 2 + +---- n3 => 3 + +---- n2 => Int64 + `---- deeper => Dict("sodeep" => Dict("a" => 4), "aleaf" + => "unbeliefable", "leaflet" => "level + 3") + +---- sodeep => Dict("a" => 4) + | `---- a => 4 + +---- aleaf => unbeliefable + `---- leaflet => level 3 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_6.txt b/test/txtfiles/tree_2_3_6.txt new file mode 100644 index 000000000..cb119689f --- /dev/null +++ b/test/txtfiles/tree_2_3_6.txt @@ -0,0 +1,8 @@ +tree_2_3_6 + +---- 3 => OrderedDict(3 => 8, 1 => "a") + | +---- 3 => 8 + | `---- 1 => a + `---- 2 => OrderedDict(3 => 8, 1 => "a") + +---- 3 => 8 + `---- 1 => a + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_7.txt b/test/txtfiles/tree_2_3_7.txt new file mode 100644 index 000000000..ba5ff5555 --- /dev/null +++ b/test/txtfiles/tree_2_3_7.txt @@ -0,0 +1,7 @@ +tree_2_3_7 + +---- 2 => 1 + `---- 3 => OrderedDict(4 => 2, "a" => 2, "b" => 1) + +---- 4 => 2 + +---- a => 2 + `---- b => 1 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_8.txt b/test/txtfiles/tree_2_3_8.txt new file mode 100644 index 000000000..20a8be710 --- /dev/null +++ b/test/txtfiles/tree_2_3_8.txt @@ -0,0 +1,8 @@ +tree_2_3_8 + +---- 1 => 1 + +---- 2 => 2 + `---- 3 => [2, 3, 4] + +---- 1 => 2 + +---- 2 => 3 + `---- 3 => 4 + \ No newline at end of file diff --git a/test/txtfiles/tree_2_3_9.txt b/test/txtfiles/tree_2_3_9.txt new file mode 100644 index 000000000..b30846e54 --- /dev/null +++ b/test/txtfiles/tree_2_3_9.txt @@ -0,0 +1,26 @@ +tree_2_3_9 + +---- 1 => 1 + +---- 2 => Any[2, [3, 4], "aaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] + | +---- 1 => 2 + | +---- 2 => [3, 4] + | | +---- 1 => 3 + | | `---- 2 => 4 + | `---- 3 => aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + | aaaaaaaaaaaaaaaaaaaaaaaa + +---- 3 => c + `---- 4 => OrderedDict(2 => "a", 1 => :ok, "a" => + 2, :test => [1, 2]) + +---- 2 => a + +---- 1 => ok + +---- a => 2 + `---- test => [1, 2] + +---- 1 => 1 + `---- 2 => 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_3.txt b/test/txtfiles/tree_3.txt deleted file mode 100644 index 43ab9d2f5..000000000 --- a/test/txtfiles/tree_3.txt +++ /dev/null @@ -1,11 +0,0 @@ - tree -━━━━━━ - │  - ├── leaf: 2 - ├── nested - │ ├── n1: 1 - │ └── n2: 2 - ├── canopy: test - ├── leafme: v - ├── ["a"]: test - └── leaf2: 2 \ No newline at end of file diff --git a/test/txtfiles/tree_4.txt b/test/txtfiles/tree_4.txt deleted file mode 100644 index 704ff4329..000000000 --- a/test/txtfiles/tree_4.txt +++ /dev/null @@ -1,12 +0,0 @@ - tree -━━━━━━ - │  - ├── nested2 - │ ├── n1: a - │ └── n2: 2 - └── nested -  ├── n3: 3 -  ├── n2: Int64 -  └── deeper -   ├── aleaf: unbeliefable -   └── leaflet: level 3level 3level 3level 3level 3level... \ No newline at end of file diff --git a/test/txtfiles/tree_5.txt b/test/txtfiles/tree_5.txt deleted file mode 100644 index dfbfc8f30..000000000 --- a/test/txtfiles/tree_5.txt +++ /dev/null @@ -1,9 +0,0 @@ - tree -━━━━━━ - │  - ├── 3 - │ ├── 3: 8 - │ └── 1: a - └── 2 -  ├── 3: 8 -  └── 1: a \ No newline at end of file diff --git a/test/txtfiles/tree_6.txt b/test/txtfiles/tree_6.txt deleted file mode 100644 index ba3922eaf..000000000 --- a/test/txtfiles/tree_6.txt +++ /dev/null @@ -1,8 +0,0 @@ - tree -━━━━━━ - │  - ├── 2: 1 - └── 3 -  ├── 4: 2 -  ├── a: 2 -  └── b: 1 \ No newline at end of file diff --git a/test/txtfiles/tree_expr_1.txt b/test/txtfiles/tree_expr_1.txt index 9ce619a48..84f8ccbe2 100644 --- a/test/txtfiles/tree_expr_1.txt +++ b/test/txtfiles/tree_expr_1.txt @@ -1,11 +1,12 @@ - 2x+3y+2 -━━━━━━━━━ - │  - └── 2x+3y+2 (call: +) -  ├── 2x (call: *) -  │ ├── 2 -  │ └── x -  ├── 3y (call: *) -  │ ├── 3 -  │ └── y -  └── 2 \ No newline at end of file +2x + 3y + 2 + ├─ 1 ⇒ + + ├─ 2 ⇒ 2x + │ ├─ 1 ⇒ * + │ ├─ 2 ⇒ 2 + │ └─ 3 ⇒ x + ├─ 3 ⇒ 3y + │ ├─ 1 ⇒ * + │ ├─ 2 ⇒ 3 + │ └─ 3 ⇒ y + └─ 4 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_expr_2.txt b/test/txtfiles/tree_expr_2.txt index 6d231718c..2d521351a 100644 --- a/test/txtfiles/tree_expr_2.txt +++ b/test/txtfiles/tree_expr_2.txt @@ -1,12 +1,13 @@ - 2x+3+2+2y -━━━━━━━━━━━ - │  - └── 2x+3+2+2y (call: +) -  ├── 2x (call: *) -  │ ├── 2 -  │ └── x -  ├── 3 -  ├── 2 -  └── 2y (call: *) -   ├── 2 -   └── y \ No newline at end of file +2x + 3 + 2 + 2y + ├─ 1 ⇒ + + ├─ 2 ⇒ 2x + │ ├─ 1 ⇒ * + │ ├─ 2 ⇒ 2 + │ └─ 3 ⇒ x + ├─ 3 ⇒ 3 + ├─ 4 ⇒ 2 + └─ 5 ⇒ 2y + ├─ 1 ⇒ * + ├─ 2 ⇒ 2 + └─ 3 ⇒ y + \ No newline at end of file diff --git a/test/txtfiles/tree_expr_3.txt b/test/txtfiles/tree_expr_3.txt index 3fec0de41..877340da2 100644 --- a/test/txtfiles/tree_expr_3.txt +++ b/test/txtfiles/tree_expr_3.txt @@ -1,10 +1,11 @@ - 2*x^(3+y) -━━━━━━━━━━━ - │  - └── 2*x^(3+y) (call: *) -  ├── 2 -  └── x^(3+y) (call: ^) -   ├── x -   └── 3+y (call: +) -    ├── 3 -    └── y \ No newline at end of file +2 * x ^ (3 + y) + ├─ 1 ⇒ * + ├─ 2 ⇒ 2 + └─ 3 ⇒ x ^ (3 + y) + ├─ 1 ⇒ ^ + ├─ 2 ⇒ x + └─ 3 ⇒ 3 + y + ├─ 1 ⇒ + + ├─ 2 ⇒ 3 + └─ 3 ⇒ y + \ No newline at end of file diff --git a/test/txtfiles/tree_expr_4.txt b/test/txtfiles/tree_expr_4.txt index 070710d0b..0d1e005d9 100644 --- a/test/txtfiles/tree_expr_4.txt +++ b/test/txtfiles/tree_expr_4.txt @@ -1,12 +1,14 @@ - (1+1)-2*x^2 -━━━━━━━━━━━━━ - │  - └── (1+1)-2*x^2 (call: -) -  ├── 1+1 (call: +) -  │ ├── 1 -  │ └── 1 -  └── 2*x^2 (call: *) -   ├── 2 -   └── x^2 (call: ^) -    ├── x -    └── 2 \ No newline at end of file +(1 + 1) - 2 * x ^ 2 + ├─ 1 ⇒ - + ├─ 2 ⇒ 1 + 1 + │ ├─ 1 ⇒ + + │ ├─ 2 ⇒ 1 + │ └─ 3 ⇒ 1 + └─ 3 ⇒ 2 * x ^ 2 + ├─ 1 ⇒ * + ├─ 2 ⇒ 2 + └─ 3 ⇒ x ^ 2 + ├─ 1 ⇒ ^ + ├─ 2 ⇒ x + └─ 3 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_expr_5.txt b/test/txtfiles/tree_expr_5.txt index 281a0760d..214d40014 100644 --- a/test/txtfiles/tree_expr_5.txt +++ b/test/txtfiles/tree_expr_5.txt @@ -1,6 +1,5 @@ - mod(22,6) -━━━━━━━━━━━ - │  - └── mod(22,6) (call: mod) -  ├── 22 -  └── 6 \ No newline at end of file +mod(22, 6) + ├─ 1 ⇒ mod + ├─ 2 ⇒ 22 + └─ 3 ⇒ 6 + \ No newline at end of file diff --git a/test/txtfiles/tree_expr_6.txt b/test/txtfiles/tree_expr_6.txt index 1d239c457..cb64da4e8 100644 --- a/test/txtfiles/tree_expr_6.txt +++ b/test/txtfiles/tree_expr_6.txt @@ -1,14 +1,17 @@ - 2*x^(3+y)+2z -━━━━━━━━━━━━━━ - │  - └── 2*x^(3+y)+2z (call: +) -  ├── 2*x^(3+y) (call: *) -  │ ├── 2 -  │ └── x^(3+y) (call: ^) -  │  ├── x -  │  └── 3+y (call: +) -  │   ├── 3 -  │   └── y -  └── 2z (call: *) -   ├── 2 -   └── z \ No newline at end of file +2 * x ^ (3 + y) + 2z + ├─ 1 ⇒ + + ├─ 2 ⇒ 2 * x ^ (3 + y) + │ ├─ 1 ⇒ * + │ ├─ 2 ⇒ 2 + │ └─ 3 ⇒ x ^ (3 + y) + │ ├─ 1 ⇒ ^ + │ ├─ 2 ⇒ x + │ └─ 3 ⇒ 3 + y + │ ├─ 1 ⇒ + + │ ├─ 2 ⇒ 3 + │ └─ 3 ⇒ y + └─ 3 ⇒ 2z + ├─ 1 ⇒ * + ├─ 2 ⇒ 2 + └─ 3 ⇒ z + \ No newline at end of file diff --git a/test/txtfiles/tree_expr_7.txt b/test/txtfiles/tree_expr_7.txt index cc3f1090d..c45be254c 100644 --- a/test/txtfiles/tree_expr_7.txt +++ b/test/txtfiles/tree_expr_7.txt @@ -1,15 +1,19 @@ - 2x+3*√(3*x^2) -━━━━━━━━━━━━━━━ - │  - └── 2x+3*√(3*x^2) (call: +) -  ├── 2x (call: *) -  │ ├── 2 -  │ └── x -  └── 3*√(3*x^2) (call: *) -   ├── 3 -   └── √(3*x^2) (call: √) -    └── 3*x^2 (call: *) -     ├── 3 -     └── x^2 (call: ^) -      ├── x -      └── 2 \ No newline at end of file +2x + 3 * √(3 * x ^ 2) + ├─ 1 ⇒ + + ├─ 2 ⇒ 2x + │ ├─ 1 ⇒ * + │ ├─ 2 ⇒ 2 + │ └─ 3 ⇒ x + └─ 3 ⇒ 3 * √(3 * x ^ 2) + ├─ 1 ⇒ * + ├─ 2 ⇒ 3 + └─ 3 ⇒ √(3 * x ^ 2) + ├─ 1 ⇒ √ + └─ 2 ⇒ 3 * x ^ 2 + ├─ 1 ⇒ * + ├─ 2 ⇒ 3 + └─ 3 ⇒ x ^ 2 + ├─ 1 ⇒ ^ + ├─ 2 ⇒ x + └─ 3 ⇒ 2 + \ No newline at end of file diff --git a/test/txtfiles/tree_expr_8.txt b/test/txtfiles/tree_expr_8.txt index 68322890d..a10d7c687 100644 --- a/test/txtfiles/tree_expr_8.txt +++ b/test/txtfiles/tree_expr_8.txt @@ -1,6 +1,6 @@ - print(lstrip("test")) -━━━━━━━━━━━━━━━━━━━━━━━ - │  - └── print(lstrip("test")) (call: print) -  └── lstrip("test") (call: lstrip) -   └── test \ No newline at end of file +print(lstrip("test")) + ├─ 1 ⇒ print + └─ 2 ⇒ lstrip("test") + ├─ 1 ⇒ lstrip + └─ 2 ⇒ test + \ No newline at end of file diff --git a/test/txtfiles/trim_renderables_2.txt b/test/txtfiles/trim_renderables_2.txt index 9f9273d08..75bcaf648 100644 --- a/test/txtfiles/trim_renderables_2.txt +++ b/test/txtfiles/trim_renderables_2.txt @@ -1,10 +1,10 @@ ╭─────────────────────... -│ aa bbaa bbaa bbaa... -│ bbaa bbaa bbaa... -│ bbaa bbaa bbaa... -│ bbaa bbaa bbaa... -│ bbaa bbaa bbaa... -│ bbaa bbaa bbaa... -│ bbaa bbaa bbaa... -│ bbaa bbaa bb... +│ aa bbaa bbaa bbaa... +│ bbaa bbaa bbaa... +│ bbaa bbaa bbaa... +│ bbaa bbaa bbaa... +│ bbaa bbaa bbaa... +│ bbaa bbaa bbaa... +│ bbaa bbaa bbaa... +│ bbaa bbaa bb... ╰─────────────────────... \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_1_(1).txt b/test/txtfiles/widget_buttonsmenu_1_1_1_(1).txt new file mode 100644 index 000000000..462e180a5 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_1_(1).txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_1_(2).txt b/test/txtfiles/widget_buttonsmenu_1_1_1_(2).txt new file mode 100644 index 000000000..462e180a5 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_1_(2).txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_1_1_b.txt b/test/txtfiles/widget_buttonsmenu_1_1_1_1_b.txt new file mode 100644 index 000000000..89e1439b3 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_1_1_b.txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_1_2_b.txt b/test/txtfiles/widget_buttonsmenu_1_1_1_2_b.txt new file mode 100644 index 000000000..89e1439b3 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_1_2_b.txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_2_(1).txt b/test/txtfiles/widget_buttonsmenu_1_1_2_(1).txt new file mode 100644 index 000000000..462e180a5 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_2_(1).txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_2_(2).txt b/test/txtfiles/widget_buttonsmenu_1_1_2_(2).txt new file mode 100644 index 000000000..462e180a5 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_2_(2).txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_2_1_b.txt b/test/txtfiles/widget_buttonsmenu_1_1_2_1_b.txt new file mode 100644 index 000000000..89e1439b3 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_2_1_b.txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_1_2_2_b.txt b/test/txtfiles/widget_buttonsmenu_1_1_2_2_b.txt new file mode 100644 index 000000000..89e1439b3 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_1_2_2_b.txt @@ -0,0 +1,9 @@ +┌────────────────────────────────────────────────┐ +│  one  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  two  │ +└────────────────────────────────────────────────┘ +┌────────────────────────────────────────────────┐ +│  three  │ +└────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_1_(1).txt b/test/txtfiles/widget_buttonsmenu_1_2_1_(1).txt new file mode 100644 index 000000000..726637f8d --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_1_(1).txt @@ -0,0 +1,5 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_1_(2).txt b/test/txtfiles/widget_buttonsmenu_1_2_1_(2).txt new file mode 100644 index 000000000..94b3fdcca --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_1_(2).txt @@ -0,0 +1,10 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_1_1_b.txt b/test/txtfiles/widget_buttonsmenu_1_2_1_1_b.txt new file mode 100644 index 000000000..c548fdeb8 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_1_1_b.txt @@ -0,0 +1,5 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_1_2_b.txt b/test/txtfiles/widget_buttonsmenu_1_2_1_2_b.txt new file mode 100644 index 000000000..94c6d8474 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_1_2_b.txt @@ -0,0 +1,10 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_2_(1).txt b/test/txtfiles/widget_buttonsmenu_1_2_2_(1).txt new file mode 100644 index 000000000..726637f8d --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_2_(1).txt @@ -0,0 +1,5 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_2_(2).txt b/test/txtfiles/widget_buttonsmenu_1_2_2_(2).txt new file mode 100644 index 000000000..94b3fdcca --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_2_(2).txt @@ -0,0 +1,10 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_2_1_b.txt b/test/txtfiles/widget_buttonsmenu_1_2_2_1_b.txt new file mode 100644 index 000000000..c548fdeb8 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_2_1_b.txt @@ -0,0 +1,5 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_1_2_2_2_b.txt b/test/txtfiles/widget_buttonsmenu_1_2_2_2_b.txt new file mode 100644 index 000000000..94c6d8474 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_1_2_2_2_b.txt @@ -0,0 +1,10 @@ +┌──────────────┐┌──────────────┐┌──────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└──────────────┘└──────────────┘└──────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_1_(1).txt b/test/txtfiles/widget_buttonsmenu_2_1_1_(1).txt new file mode 100644 index 000000000..a2296b341 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_1_(1).txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_1_(2).txt b/test/txtfiles/widget_buttonsmenu_2_1_1_(2).txt new file mode 100644 index 000000000..a2296b341 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_1_(2).txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_1_1_b.txt b/test/txtfiles/widget_buttonsmenu_2_1_1_1_b.txt new file mode 100644 index 000000000..2b08120a4 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_1_1_b.txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_1_2_b.txt b/test/txtfiles/widget_buttonsmenu_2_1_1_2_b.txt new file mode 100644 index 000000000..2b08120a4 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_1_2_b.txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_2_(1).txt b/test/txtfiles/widget_buttonsmenu_2_1_2_(1).txt new file mode 100644 index 000000000..a2296b341 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_2_(1).txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_2_(2).txt b/test/txtfiles/widget_buttonsmenu_2_1_2_(2).txt new file mode 100644 index 000000000..a2296b341 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_2_(2).txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_2_1_b.txt b/test/txtfiles/widget_buttonsmenu_2_1_2_1_b.txt new file mode 100644 index 000000000..2b08120a4 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_2_1_b.txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_1_2_2_b.txt b/test/txtfiles/widget_buttonsmenu_2_1_2_2_b.txt new file mode 100644 index 000000000..2b08120a4 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_1_2_2_b.txt @@ -0,0 +1,9 @@ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  one  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  two  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│  three  │ +└──────────────────────────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_1_(1).txt b/test/txtfiles/widget_buttonsmenu_2_2_1_(1).txt new file mode 100644 index 000000000..833377a0f --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_1_(1).txt @@ -0,0 +1,5 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_1_(2).txt b/test/txtfiles/widget_buttonsmenu_2_2_1_(2).txt new file mode 100644 index 000000000..5653ec12d --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_1_(2).txt @@ -0,0 +1,10 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_1_1_b.txt b/test/txtfiles/widget_buttonsmenu_2_2_1_1_b.txt new file mode 100644 index 000000000..e06eedc14 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_1_1_b.txt @@ -0,0 +1,5 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_1_2_b.txt b/test/txtfiles/widget_buttonsmenu_2_2_1_2_b.txt new file mode 100644 index 000000000..a2195d3f7 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_1_2_b.txt @@ -0,0 +1,10 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_2_(1).txt b/test/txtfiles/widget_buttonsmenu_2_2_2_(1).txt new file mode 100644 index 000000000..833377a0f --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_2_(1).txt @@ -0,0 +1,5 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_2_(2).txt b/test/txtfiles/widget_buttonsmenu_2_2_2_(2).txt new file mode 100644 index 000000000..5653ec12d --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_2_(2).txt @@ -0,0 +1,10 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_2_1_b.txt b/test/txtfiles/widget_buttonsmenu_2_2_2_1_b.txt new file mode 100644 index 000000000..e06eedc14 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_2_1_b.txt @@ -0,0 +1,5 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_buttonsmenu_2_2_2_2_b.txt b/test/txtfiles/widget_buttonsmenu_2_2_2_2_b.txt new file mode 100644 index 000000000..a2195d3f7 --- /dev/null +++ b/test/txtfiles/widget_buttonsmenu_2_2_2_2_b.txt @@ -0,0 +1,10 @@ +┌───────────────────────────────┐┌───────────────────────────────┐┌───────────────────────────────┐ +│  one  ││  two  ││  three  │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +│ ││ ││ │ +└───────────────────────────────┘└───────────────────────────────┘└───────────────────────────────┘ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_1_1.txt b/test/txtfiles/widget_gal_1_1_1.txt new file mode 100644 index 000000000..da0fcdae8 --- /dev/null +++ b/test/txtfiles/widget_gal_1_1_1.txt @@ -0,0 +1,20 @@ +╭───────────────────── Widget 1/2 ─────────────────────╮ +│ │ +│ │aaa │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_1_1_b.txt b/test/txtfiles/widget_gal_1_1_1_b.txt new file mode 100644 index 000000000..e94c2d834 --- /dev/null +++ b/test/txtfiles/widget_gal_1_1_1_b.txt @@ -0,0 +1,20 @@ +╭───────────────────── Widget 2/2 ─────────────────────╮ +│ │ +│ ╭──────────────────────────────────────────────────╮ │ +│ │ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa│ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │   │ │ +│ ╰──────────────────────────── Lines: 1:12 of 14 ───╯ │ +│ │ +╰──────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_1_2.txt b/test/txtfiles/widget_gal_1_1_2.txt new file mode 100644 index 000000000..743495298 --- /dev/null +++ b/test/txtfiles/widget_gal_1_1_2.txt @@ -0,0 +1 @@ +│aaa \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_1_2_b.txt b/test/txtfiles/widget_gal_1_1_2_b.txt new file mode 100644 index 000000000..830fd8fc5 --- /dev/null +++ b/test/txtfiles/widget_gal_1_1_2_b.txt @@ -0,0 +1,20 @@ +╭──────────────────────────────────────────────────────╮ +│ │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│    │ +│   │ +│ │ │ +│ │ │ +│  ... content omitted ...  │ +╰──────────────────────────────── Lines: 1:13 of 13 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_2_1.txt b/test/txtfiles/widget_gal_1_2_1.txt new file mode 100644 index 000000000..17f58e81c --- /dev/null +++ b/test/txtfiles/widget_gal_1_2_1.txt @@ -0,0 +1,40 @@ +╭───────────────────── Widget 1/2 ─────────────────────╮ +│ │ +│ │aaa │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_2_1_b.txt b/test/txtfiles/widget_gal_1_2_1_b.txt new file mode 100644 index 000000000..a2bb49d0c --- /dev/null +++ b/test/txtfiles/widget_gal_1_2_1_b.txt @@ -0,0 +1,40 @@ +╭───────────────────── Widget 2/2 ─────────────────────╮ +│ │ +│ ╭──────────────────────────────────────────────────╮ │ +│ │ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aa   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │ │ │ │ +│ │ │ │ │ +│ │  ... content omitted ...  │ │ +│ ╰──────────────────────────── Lines: 1:14 of 14 ───╯ │ +│ │ +╰──────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_2_2.txt b/test/txtfiles/widget_gal_1_2_2.txt new file mode 100644 index 000000000..743495298 --- /dev/null +++ b/test/txtfiles/widget_gal_1_2_2.txt @@ -0,0 +1 @@ +│aaa \ No newline at end of file diff --git a/test/txtfiles/widget_gal_1_2_2_b.txt b/test/txtfiles/widget_gal_1_2_2_b.txt new file mode 100644 index 000000000..f9ec117af --- /dev/null +++ b/test/txtfiles/widget_gal_1_2_2_b.txt @@ -0,0 +1,40 @@ +╭──────────────────────────────────────────────────────╮ +│ │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│    │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│ │ │ +│ │ │ +│  ... content omitted ...  │ +╰──────────────────────────────── Lines: 1:13 of 13 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_1_1.txt b/test/txtfiles/widget_gal_2_1_1.txt new file mode 100644 index 000000000..acc082672 --- /dev/null +++ b/test/txtfiles/widget_gal_2_1_1.txt @@ -0,0 +1,20 @@ +╭───────────────────────────────── Widget 1/2 ─────────────────────────────────╮ +│ │ +│ │aaa │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_1_1_b.txt b/test/txtfiles/widget_gal_2_1_1_b.txt new file mode 100644 index 000000000..266fea8d4 --- /dev/null +++ b/test/txtfiles/widget_gal_2_1_1_b.txt @@ -0,0 +1,20 @@ +╭───────────────────────────────── Widget 2/2 ─────────────────────────────────╮ +│ │ +│ ╭──────────────────────────────────────────────────────────────────────────╮ │ +│ │ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   │ │ +│ │   │ │ +│ │ │ │ │ +│ │ │ │ │ +│ │  ... content omitted ...  │ │ +│ ╰────────────────────────────────────────────────────── Lines: 1:9 of 9 ───╯ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_1_2.txt b/test/txtfiles/widget_gal_2_1_2.txt new file mode 100644 index 000000000..53c310376 --- /dev/null +++ b/test/txtfiles/widget_gal_2_1_2.txt @@ -0,0 +1 @@ +│aaa \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_1_2_b.txt b/test/txtfiles/widget_gal_2_1_2_b.txt new file mode 100644 index 000000000..95a899450 --- /dev/null +++ b/test/txtfiles/widget_gal_2_1_2_b.txt @@ -0,0 +1,20 @@ +╭──────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaa   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│ │ │ +│ │ │ +│  ... content omitted ...  │ +╰────────────────────────────────────────────────────────── Lines: 1:9 of 9 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_2_1.txt b/test/txtfiles/widget_gal_2_2_1.txt new file mode 100644 index 000000000..6feca5394 --- /dev/null +++ b/test/txtfiles/widget_gal_2_2_1.txt @@ -0,0 +1,40 @@ +╭───────────────────────────────── Widget 1/2 ─────────────────────────────────╮ +│ │ +│ │aaa │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_2_1_b.txt b/test/txtfiles/widget_gal_2_2_1_b.txt new file mode 100644 index 000000000..e84dc9ea7 --- /dev/null +++ b/test/txtfiles/widget_gal_2_2_1_b.txt @@ -0,0 +1,40 @@ +╭───────────────────────────────── Widget 2/2 ─────────────────────────────────╮ +│ │ +│ ╭──────────────────────────────────────────────────────────────────────────╮ │ +│ │ │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ │ +│ │ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │   │ │ +│ │ │ │ │ +│ │ │ │ │ +│ │  ... content omitted ...  │ │ +│ ╰────────────────────────────────────────────────────── Lines: 1:9 of 9 ───╯ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_2_2.txt b/test/txtfiles/widget_gal_2_2_2.txt new file mode 100644 index 000000000..53c310376 --- /dev/null +++ b/test/txtfiles/widget_gal_2_2_2.txt @@ -0,0 +1 @@ +│aaa \ No newline at end of file diff --git a/test/txtfiles/widget_gal_2_2_2_b.txt b/test/txtfiles/widget_gal_2_2_2_b.txt new file mode 100644 index 000000000..f7fb42223 --- /dev/null +++ b/test/txtfiles/widget_gal_2_2_2_b.txt @@ -0,0 +1,40 @@ +╭──────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  │ +│ aaaaaaaa   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│   │ +│ │ │ +│ │ │ +│  ... content omitted ...  │ +╰────────────────────────────────────────────────────────── Lines: 1:9 of 9 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_inputbox.txt b/test/txtfiles/widget_inputbox.txt new file mode 100644 index 000000000..566e6c533 --- /dev/null +++ b/test/txtfiles/widget_inputbox.txt @@ -0,0 +1,5 @@ +╭──────────────────────────────────────────────────────────────────────────────╮ +│ a │ +│ c │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_1_1.txt b/test/txtfiles/widget_multiselectmenu_1_1.txt new file mode 100644 index 000000000..3825b0851 --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_1_1.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_1_1_b.txt b/test/txtfiles/widget_multiselectmenu_1_1_b.txt new file mode 100644 index 000000000..92d639dad --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_1_1_b.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_1_2.txt b/test/txtfiles/widget_multiselectmenu_1_2.txt new file mode 100644 index 000000000..49e1ab4ea --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_1_2.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_1_2_b.txt b/test/txtfiles/widget_multiselectmenu_1_2_b.txt new file mode 100644 index 000000000..e6069f01f --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_1_2_b.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_2_1.txt b/test/txtfiles/widget_multiselectmenu_2_1.txt new file mode 100644 index 000000000..3825b0851 --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_2_1.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_2_1_b.txt b/test/txtfiles/widget_multiselectmenu_2_1_b.txt new file mode 100644 index 000000000..92d639dad --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_2_1_b.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_2_2.txt b/test/txtfiles/widget_multiselectmenu_2_2.txt new file mode 100644 index 000000000..49e1ab4ea --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_2_2.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_multiselectmenu_2_2_b.txt b/test/txtfiles/widget_multiselectmenu_2_2_b.txt new file mode 100644 index 000000000..e6069f01f --- /dev/null +++ b/test/txtfiles/widget_multiselectmenu_2_2_b.txt @@ -0,0 +1,3 @@ +□ one +□ two +□ three \ No newline at end of file diff --git a/test/txtfiles/widget_pager_1_1_1.txt b/test/txtfiles/widget_pager_1_1_1.txt new file mode 100644 index 000000000..e06559935 --- /dev/null +++ b/test/txtfiles/widget_pager_1_1_1.txt @@ -0,0 +1,20 @@ +╭──── test ──────────────────╮ +│ │ +│ voluptate velit esse   │ +│ cillum dolore eu fugiat   │ +│ nulla pariatur. Excepteu  │ +│ r sint occaecat cupidata  │ +│ t non proident, sunt   │ +│ in culpa qui officia   │ +│ deserun   │ +│ mollit anim id est   │ +│ laborum.Lorem ipsum   │ +│ dolor sit amet, consecte  │ +│ tur adipiscing elit,   │ +│ sed do eiusmod tempor   │ +│ incididunt ut labore │ │ +│ et dolore magna aliqua. │ │ +│ Ut enim ad minim veniam,│ │ +│ quis nostrud exercitati│ │ +│  ... content omitted ...  │ +╰────────────── Lines:... ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_pager_1_1_2.txt b/test/txtfiles/widget_pager_1_1_2.txt new file mode 100644 index 000000000..92dc5e1fb --- /dev/null +++ b/test/txtfiles/widget_pager_1_1_2.txt @@ -0,0 +1,20 @@ +╭──── test ──────────────────╮ +│ │ +│ Excepteu  │   │ +│ │ r sint occaecat   │ +│ cupidata  │   │ +│ │ t non proident,   │ +│ sunt   │ │ │ +│ │ in culpa qui officia │ │ +│   │ │ │ +│ │ deserun │ │ +│   │ │ │ +│ │ mollit anim id │ │ +│ est   │   │ +│ │ laborum.Lorem ipsum   │ +│   │   │ +│ │ dolor sit amet,   │ +│ consecte  │   │ +│ │ tur adipiscing elit,   │ +│   │ +╰────────────── Lines:... ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_pager_1_2_1.txt b/test/txtfiles/widget_pager_1_2_1.txt new file mode 100644 index 000000000..bfdc3ac46 --- /dev/null +++ b/test/txtfiles/widget_pager_1_2_1.txt @@ -0,0 +1,40 @@ +╭──── test ──────────────────╮ +│ │ +│ ╭──── test ─────────────  │ +│ ─────╮   │ +│ │   │ +│ │   │ +│ │ Excepteu  │   │ +│   │ │ │ +│ │ │ r sint occaecat │ │ +│   │ │ │ +│ │ cupidata  │ │ │ +│   │ │ │ +│ │ │ t non proident, │ │ +│   │   │ +│ │ sunt   │   │ +│ │ │   │ +│ │ │ in culpa qui   │ +│ officia │ │   │ +│ │   │   │ +│ │ │   │ +│ │ │ deserun   │ +│ │ │   │ +│ │   │   │ +│ │ │   │ +│ │ │ mollit anim   │ +│ id │ │   │ +│ │ est   │   │ +│   │   │ +│ │ │ laborum.Lorem   │ +│ ipsum   │   │ +│ │   │   │ +│   │   │ +│ │ │ dolor sit amet,   │ +│   │   │ +│ │ consecte  │   │ +│   │   │ +│ │ │ tur adipiscing   │ +│ elit,   │   │ +│   │ +╰────── Lines: 1:36 of 40 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_pager_1_2_2.txt b/test/txtfiles/widget_pager_1_2_2.txt new file mode 100644 index 000000000..2b21e70d7 --- /dev/null +++ b/test/txtfiles/widget_pager_1_2_2.txt @@ -0,0 +1,40 @@ +╭──── test ──────────────────╮ +│ │ +│   │   │ +│ │ │   │ +│   │   │ +│ │ │ Excepteu  │   │ +│   │   │ +│ │   │   │ +│ │ │ │ │ +│ │ │ │ r sint occaecat│ │ +│  │ │ │ │ +│ │   │ │ │ +│ │ │ │ │ +│ │ │ cupidata  │ │ │ +│ │ │   │ +│ │   │   │ +│ │ │   │ +│ │ │ │ t non proident,  │ +│  │ │   │ +│ │   │   │ +│   │   │ +│ │ │ sunt   │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ in culpa qui   │ +│   │   │ +│ │ officia │ │   │ +│   │   │ +│ │ │   │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ deserun   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │   │   │ +│   │ +╰────────────── Lines:... ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_pager_2_1_1.txt b/test/txtfiles/widget_pager_2_1_1.txt new file mode 100644 index 000000000..ab9d9423d --- /dev/null +++ b/test/txtfiles/widget_pager_2_1_1.txt @@ -0,0 +1,20 @@ +╭──── test ────────────────────────────────────────────────╮ +│ │ +│ │ │ │ │ r sint occaecat│ │   │ +│ │  │ │ │ │   │ +│ │ │   │ │ │   │ +│ │ │ │ │ │   │ +│ │ │ │ cupidata  │ │ │ │ │ +│ │ │ │   │ │ │ +│ │ │   │   │ │ │ +│ │ │ │   │ │ │ +│ │ │ │ │ t non proident,  │ │ │ +│ │  │ │   │ │ │ +│ │ │   │   │   │ +│ │   │   │   │ +│ │ │ │ sunt   │   │   │ +│ │   │   │   │ +│ │ │ │ │   │   │ +│ │   │   │   │ +│   │ +╰─────────────────────────────────── Lines: 10:25 of 40 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_pager_2_1_2.txt b/test/txtfiles/widget_pager_2_1_2.txt new file mode 100644 index 000000000..b4790c9aa --- /dev/null +++ b/test/txtfiles/widget_pager_2_1_2.txt @@ -0,0 +1,20 @@ +╭──── test ────────────────────────────────────────────────╮ +│ │ +│   │   │ +│ │ │ │ │ │ │   │ +│   │   │ +│ │ │ │ │ cupidata  │ │ │   │ +│ │ │ │ │ +│ │ │ │ │   │ │ │ +│ │ │ │ │ +│ │ │ │   │   │ │ │ +│ │ │ │ │ +│ │ │ │ │   │ │ │ +│ │ │   │ +│ │ │ │ │ │ t non proident,  │   │ +│ │ │   │ +│ │ │  │ │   │   │ +│ │ │   │ +│ │ │ │   │   │   │ +│   │ +╰─────────────────────────────────── Lines: 10:25 of 40 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_pager_2_2_1.txt b/test/txtfiles/widget_pager_2_2_1.txt new file mode 100644 index 000000000..cea0f2884 --- /dev/null +++ b/test/txtfiles/widget_pager_2_2_1.txt @@ -0,0 +1,40 @@ +╭──── test ────────────────────────────────────────────────╮ +│ │ +│ ╭──── test ───────────────────────────────────────────  │ +│ ─────╮   │ +│ │   │ +│ │   │ +│ │   │   │ +│   │ │ │ +│ │ │ │ │ │ │ │ │ │ +│   │ │ │ +│ │   │ │ │ +│   │ │ │ +│ │ │ │ │ │ cupidata  │ │ │ │ │ +│   │   │ +│ │ │ │   │ +│ │ │   │ +│ │ │ │ │ │   │   │ +│ │ │   │ +│ │ │ │   │ +│ │ │   │ +│ │ │ │ │   │   │   │ +│ │ │   │ +│ │ │ │   │ +│ │ │   │ +│ │ │ │ │ │   │   │ +│ │ │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ │ │ │ t non proident,  │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │  │ │   │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ │   │   │   │ +│   │   │ +│   │ +╰──────────────────────────────────── Lines: 1:36 of 40 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_pager_2_2_2.txt b/test/txtfiles/widget_pager_2_2_2.txt new file mode 100644 index 000000000..8b2a03716 --- /dev/null +++ b/test/txtfiles/widget_pager_2_2_2.txt @@ -0,0 +1,40 @@ +╭──── test ────────────────────────────────────────────────╮ +│ │ +│   │   │ +│ │ │   │ +│   │   │ +│ │ │   │   │ +│   │   │ +│ │   │   │ +│ │ │ │ │ +│ │ │ │ │ │ │ │ │ │ │ +│ │ │ │ │ +│ │   │ │ │ +│ │ │ │ │ +│ │ │   │ │ │ +│ │ │   │ +│ │   │   │ +│ │ │   │ +│ │ │ │ │ │ │ cupidata  │ │ │   │ +│ │ │   │ +│ │   │   │ +│   │   │ +│ │ │ │ │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ │ │ │   │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ │ │   │   │   │ +│   │   │ +│ │ │ │   │ +│   │   │ +│ │ │ │ │   │ +│   │ +╰─────────────────────────────────── Lines: 10:45 of 80 ───╯ \ No newline at end of file diff --git a/test/txtfiles/widget_placeholder.txt b/test/txtfiles/widget_placeholder.txt new file mode 100644 index 000000000..65c4887b8 --- /dev/null +++ b/test/txtfiles/widget_placeholder.txt @@ -0,0 +1,5 @@ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  + ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ +╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲ ╲  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_1_1.txt b/test/txtfiles/widget_simplemenu_1_1_1.txt new file mode 100644 index 000000000..992d93a3c --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_1_1.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_1_1_b.txt b/test/txtfiles/widget_simplemenu_1_1_1_b.txt new file mode 100644 index 000000000..ecce5659c --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_1_1_b.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_1_2.txt b/test/txtfiles/widget_simplemenu_1_1_2.txt new file mode 100644 index 000000000..de17b10ff --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_1_2.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_1_2_b.txt b/test/txtfiles/widget_simplemenu_1_1_2_b.txt new file mode 100644 index 000000000..1b084c4d3 --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_1_2_b.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_2_1.txt b/test/txtfiles/widget_simplemenu_1_2_1.txt new file mode 100644 index 000000000..fd606be1c --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_2_1.txt @@ -0,0 +1 @@ +one two three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_2_1_b.txt b/test/txtfiles/widget_simplemenu_1_2_1_b.txt new file mode 100644 index 000000000..e745283bc --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_2_1_b.txt @@ -0,0 +1 @@ +one two three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_2_2.txt b/test/txtfiles/widget_simplemenu_1_2_2.txt new file mode 100644 index 000000000..961eb332b --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_2_2.txt @@ -0,0 +1 @@ +one two three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_1_2_2_b.txt b/test/txtfiles/widget_simplemenu_1_2_2_b.txt new file mode 100644 index 000000000..5299d34e6 --- /dev/null +++ b/test/txtfiles/widget_simplemenu_1_2_2_b.txt @@ -0,0 +1 @@ +one two three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_1_1.txt b/test/txtfiles/widget_simplemenu_2_1_1.txt new file mode 100644 index 000000000..992d93a3c --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_1_1.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_1_1_b.txt b/test/txtfiles/widget_simplemenu_2_1_1_b.txt new file mode 100644 index 000000000..ecce5659c --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_1_1_b.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_1_2.txt b/test/txtfiles/widget_simplemenu_2_1_2.txt new file mode 100644 index 000000000..de17b10ff --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_1_2.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_1_2_b.txt b/test/txtfiles/widget_simplemenu_2_1_2_b.txt new file mode 100644 index 000000000..1b084c4d3 --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_1_2_b.txt @@ -0,0 +1,3 @@ +one  +two  +three  \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_2_1.txt b/test/txtfiles/widget_simplemenu_2_2_1.txt new file mode 100644 index 000000000..8c4778e35 --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_2_1.txt @@ -0,0 +1,2 @@ +one two three +      \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_2_1_b.txt b/test/txtfiles/widget_simplemenu_2_2_1_b.txt new file mode 100644 index 000000000..048376745 --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_2_1_b.txt @@ -0,0 +1,2 @@ +one two three +      \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_2_2.txt b/test/txtfiles/widget_simplemenu_2_2_2.txt new file mode 100644 index 000000000..4f73514cf --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_2_2.txt @@ -0,0 +1,2 @@ +one two three +      \ No newline at end of file diff --git a/test/txtfiles/widget_simplemenu_2_2_2_b.txt b/test/txtfiles/widget_simplemenu_2_2_2_b.txt new file mode 100644 index 000000000..0c9719c6b --- /dev/null +++ b/test/txtfiles/widget_simplemenu_2_2_2_b.txt @@ -0,0 +1,2 @@ +one two three +      \ No newline at end of file diff --git a/test/txtfiles/widget_text_1_1.txt b/test/txtfiles/widget_text_1_1.txt new file mode 100644 index 000000000..0849ba237 --- /dev/null +++ b/test/txtfiles/widget_text_1_1.txt @@ -0,0 +1,3 @@ +╭──────────────────────────────────────────────────────────────────────────────╮ +│ test │ +╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_text_1_2.txt b/test/txtfiles/widget_text_1_2.txt new file mode 100644 index 000000000..220d31c46 --- /dev/null +++ b/test/txtfiles/widget_text_1_2.txt @@ -0,0 +1 @@ +│test \ No newline at end of file diff --git a/test/txtfiles/widget_text_2_1.txt b/test/txtfiles/widget_text_2_1.txt new file mode 100644 index 000000000..686224680 --- /dev/null +++ b/test/txtfiles/widget_text_2_1.txt @@ -0,0 +1,3 @@ +╭──────────────────────────────────────────────────────────────────────────────╮ +│ This is long testThis is long testThis is long testThis is long │ +╰──────────────────────────────────────────────────────────────────────────────╯ \ No newline at end of file diff --git a/test/txtfiles/widget_text_2_2.txt b/test/txtfiles/widget_text_2_2.txt new file mode 100644 index 000000000..8b90b5792 --- /dev/null +++ b/test/txtfiles/widget_text_2_2.txt @@ -0,0 +1,7 @@ +│This is long testThis is long testThis is long testThis is long testTh +│is is long testThis is long testThis is long testThis is long testThis +│ is long testThis is long testThis is long testThis is long testThis +│is long testThis is long testThis is long testThis is long testThis +│is long testThis is long testThis is long testThis is long testThis +│is long testThis is long testThis is long testThis is long testThis +│is long test \ No newline at end of file