atspi 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.yardopts +2 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +69 -0
  7. data/Rakefile +2 -0
  8. data/atspi.gemspec +23 -0
  9. data/bin/console +7 -0
  10. data/lib/atspi/accessible/action.rb +45 -0
  11. data/lib/atspi/accessible/children/selected.rb +32 -0
  12. data/lib/atspi/accessible/children.rb +72 -0
  13. data/lib/atspi/accessible/descendants/attribute_filter.rb +32 -0
  14. data/lib/atspi/accessible/descendants/interface_filter.rb +24 -0
  15. data/lib/atspi/accessible/descendants/name_filter.rb +18 -0
  16. data/lib/atspi/accessible/descendants/options.rb +49 -0
  17. data/lib/atspi/accessible/descendants/role_filter.rb +23 -0
  18. data/lib/atspi/accessible/descendants/state_filter.rb +23 -0
  19. data/lib/atspi/accessible/descendants.rb +278 -0
  20. data/lib/atspi/accessible/document.rb +26 -0
  21. data/lib/atspi/accessible/extents.rb +129 -0
  22. data/lib/atspi/accessible/hyperlink/anchor.rb +30 -0
  23. data/lib/atspi/accessible/hyperlink.rb +31 -0
  24. data/lib/atspi/accessible/image.rb +35 -0
  25. data/lib/atspi/accessible/selectable.rb +47 -0
  26. data/lib/atspi/accessible/table/cell/columns.rb +44 -0
  27. data/lib/atspi/accessible/table/cell/rows.rb +44 -0
  28. data/lib/atspi/accessible/table/cell.rb +18 -0
  29. data/lib/atspi/accessible/table/cells.rb +37 -0
  30. data/lib/atspi/accessible/table/column.rb +59 -0
  31. data/lib/atspi/accessible/table/columns/selected.rb +42 -0
  32. data/lib/atspi/accessible/table/columns.rb +34 -0
  33. data/lib/atspi/accessible/table/row.rb +59 -0
  34. data/lib/atspi/accessible/table/rows/selected.rb +42 -0
  35. data/lib/atspi/accessible/table/rows.rb +31 -0
  36. data/lib/atspi/accessible/table.rb +50 -0
  37. data/lib/atspi/accessible/text/caret.rb +31 -0
  38. data/lib/atspi/accessible/text/character.rb +45 -0
  39. data/lib/atspi/accessible/text/editable.rb +90 -0
  40. data/lib/atspi/accessible/text/hyperlink.rb +19 -0
  41. data/lib/atspi/accessible/text/hypertext.rb +29 -0
  42. data/lib/atspi/accessible/text/offset.rb +59 -0
  43. data/lib/atspi/accessible/text/range.rb +66 -0
  44. data/lib/atspi/accessible/text/selection.rb +48 -0
  45. data/lib/atspi/accessible/text.rb +120 -0
  46. data/lib/atspi/accessible/value.rb +47 -0
  47. data/lib/atspi/accessible.rb +267 -0
  48. data/lib/atspi/application.rb +46 -0
  49. data/lib/atspi/collection.rb +60 -0
  50. data/lib/atspi/desktop.rb +52 -0
  51. data/lib/atspi/extents.rb +28 -0
  52. data/lib/atspi/libatspi.rb +7 -0
  53. data/lib/atspi/requires.rb +76 -0
  54. data/lib/atspi/selectable_collection/selected.rb +23 -0
  55. data/lib/atspi/selectable_collection.rb +32 -0
  56. data/lib/atspi/state_set.rb +141 -0
  57. data/lib/atspi/version.rb +4 -0
  58. data/lib/atspi/window.rb +33 -0
  59. data/lib/atspi.rb +58 -0
  60. metadata +132 -0
@@ -0,0 +1,18 @@
1
+ module ATSPI
2
+ class Accessible::Table
3
+ # Represents a cell in a {Table}. It is child accessible of its {Table}.
4
+ class Cell < Accessible
5
+ # @return [Rows] the rows it spans
6
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-row-column-extents-at-index atspi_table_get_row_column_extents_at_index
7
+ def rows
8
+ Rows.new(@native)
9
+ end
10
+
11
+ # @return [Columns] the columns it spans
12
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-row-column-extents-at-index atspi_table_get_row_column_extents_at_index
13
+ def columns
14
+ Columns.new(@native)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,37 @@
1
+ class ATSPI::Accessible
2
+ class Table
3
+ # Represents all cells in a {Table}. Cells are also the children of their
4
+ # {Table}.
5
+ class Cells < Children
6
+ # @!group Enumerable interface
7
+ # @overload at(idx)
8
+ # @param (see Children#at)
9
+ #
10
+ # @overload at(row:, column:)
11
+ # @param (see #at_coords)
12
+ #
13
+ # @return [Cell] the cell at +idx+ or at (+row+,+column+)
14
+ #
15
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-child-at-index atspi_accessible_get_child_at_index
16
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-accessible-at atspi_table_get_accessible_at
17
+ def at(idx = nil)
18
+ if idx.is_a? Numeric
19
+ Cell.new(@native.child_at_index(idx))
20
+ else
21
+ at_coords(idx)
22
+ end
23
+ end
24
+
25
+ # @param row [Integer]
26
+ # @param colum [Integer]
27
+ #
28
+ # @return [Cell] the cell at (+row+,+column+)
29
+ #
30
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-accessible-at atspi_table_get_accessible_at
31
+ def at_coords(row:, column:)
32
+ Cell.new(@native.accessible_at(row, column))
33
+ end
34
+ # @!endgroup
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,59 @@
1
+ class ATSPI::Accessible::Table
2
+ # Represents a column in a {Table}
3
+ class Column
4
+ # @api private
5
+ def initialize(native, index)
6
+ @native = native
7
+ @index = index
8
+ end
9
+
10
+ # @group State & Attributes
11
+ # @return [Integer] its index
12
+ attr_reader :index
13
+
14
+ # @return [Cell] its header
15
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-column-header atspi_table_get_column_header
16
+ def header
17
+ header = @native.column_header(@index)
18
+ Cell.new(header) if header
19
+ end
20
+
21
+ # @return [String] its description
22
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-column-description atspi_table_get_column_description
23
+ def description
24
+ @native.column_description(@index)
25
+ end
26
+
27
+ # Checks if it is selected
28
+ # @return [true,false]
29
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-is-column-selected atspi_table_is_column_selected
30
+ def selected?
31
+ @native.is_column_selected(@index)
32
+ end
33
+ # @endgroup
34
+
35
+ # @group Actions
36
+ # Selects its
37
+ # @return [true,false]
38
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-add-column-selection atspi_table_add_column_selection
39
+ def select
40
+ @native.add_column_selection(@index)
41
+ end
42
+
43
+ # Deselects its
44
+ # @return [true,false]
45
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-remove-column-selection atspi_table_remove_column_selection
46
+ def deselect
47
+ @native.remove_column_selection(@index)
48
+ end
49
+ # @endgroup
50
+
51
+ # @group Representations
52
+ # @return [String] itself as an inspectable string
53
+ def inspect
54
+ "#<#{self.class.name}:0x#{'%x14' % __id__} @index=#{index} @selected?=#{selected?} " <<
55
+ "@description=#{description.inspect}>"
56
+ end
57
+ # @endgroup
58
+ end
59
+ end
@@ -0,0 +1,42 @@
1
+ module ATSPI
2
+ class Accessible::Table
3
+ # Represents all selected columns of a {Table}
4
+ class Columns::Selected
5
+ include SelectableCollection::Selected
6
+
7
+ # @api private
8
+ INDEX_METHOD = :index
9
+
10
+ # @api private
11
+ def initialize(native)
12
+ @native = native
13
+ end
14
+
15
+ # @!group Enumerable interface
16
+ # Iterates over all selected columns
17
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-selected-columns atspi_table_get_selected_columns
18
+ def each
19
+ @native.selected_columns.each do |idx|
20
+ yield at(idx)
21
+ end
22
+ end
23
+
24
+ # @param n [Integer] the index in the collection of selected columns and
25
+ # not the index in the collection of all the table's columns.
26
+ #
27
+ # @return [Column] the table's n'th selected column
28
+ def at(n)
29
+ super do |mapped_idx|
30
+ Column.new(@native, mapped_idx)
31
+ end
32
+ end
33
+
34
+ # @return [Integer] the number of selected columns
35
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-n-selected-columns atspi_table_get_n_selected_columns
36
+ def count
37
+ @native.n_selected_columns
38
+ end
39
+ # @!endgroup
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,34 @@
1
+ module ATSPI
2
+ class Accessible::Table
3
+ # Represents all columns in a {Table}
4
+ class Columns
5
+ include SelectableCollection
6
+
7
+ # @api private
8
+ INDEX_METHOD = :index
9
+
10
+ # @api private
11
+ def initialize(native)
12
+ @native = native
13
+ end
14
+
15
+ # @!group Enumerable interface
16
+ # @param idx [Integer]
17
+ #
18
+ # @return [Column] the column at index +idx+
19
+ def at(idx)
20
+ super do |mapped_idx|
21
+ Column.new(@native, mapped_idx)
22
+ end
23
+ end
24
+
25
+ # @return [Integer] its number of columns
26
+ #
27
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-n-columns atspi_table_get_n_columns
28
+ def count
29
+ @native.n_columns
30
+ end
31
+ # @!endgroup
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,59 @@
1
+ class ATSPI::Accessible::Table
2
+ # Represents a row in a {Table}
3
+ class Row
4
+ # @api private
5
+ def initialize(native, index)
6
+ @native = native
7
+ @index = index
8
+ end
9
+
10
+ # @group State & Attributes
11
+ # @return [Integer] its index
12
+ attr_reader :index
13
+
14
+ # @return [Cell] its header
15
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-row-header atspi_table_get_row_header
16
+ def header
17
+ header = @native.row_header(@index)
18
+ Cell.new(header) if header
19
+ end
20
+
21
+ # @return [String] its description
22
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-row-description atspi_table_get_row_description
23
+ def description
24
+ @native.row_description(@index)
25
+ end
26
+
27
+ # Checks if it is selected
28
+ # @return [true,false]
29
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-is-row-selected atspi_table_is_row_selected
30
+ def selected?
31
+ @native.is_row_selected(@index)
32
+ end
33
+ # @endgroup
34
+
35
+ # @group Actions
36
+ # Selects its
37
+ # @return [true,false]
38
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-add-row-selection atspi_table_add_row_selection
39
+ def select
40
+ @native.add_row_selection(@index)
41
+ end
42
+
43
+ # Deselects its
44
+ # @return [true,false]
45
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-remove-row-selection atspi_table_remove_row_selection
46
+ def deselect
47
+ @native.remove_row_selection(@index)
48
+ end
49
+ # @endgroup
50
+
51
+ # @group Representations
52
+ # @return [String] itself as an inspectable string
53
+ def inspect
54
+ "#<#{self.class.name}:0x#{'%x14' % __id__} @index=#{index} @selected?=#{selected?} " <<
55
+ "@description=#{description.inspect}>"
56
+ end
57
+ # @endgroup
58
+ end
59
+ end
@@ -0,0 +1,42 @@
1
+ module ATSPI
2
+ class Accessible::Table
3
+ # Represents all selected rows of a {Table}
4
+ class Rows::Selected
5
+ include SelectableCollection::Selected
6
+
7
+ # @api private
8
+ INDEX_METHOD = :index
9
+
10
+ # @api private
11
+ def initialize(native)
12
+ @native = native
13
+ end
14
+
15
+ # @!group Enumerable interface
16
+ # Iterates over all selected rows
17
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-selected-rows atspi_table_get_selected_rows
18
+ def each
19
+ @native.selected_rows.each do |idx|
20
+ yield at(idx)
21
+ end
22
+ end
23
+
24
+ # @param n [Integer] the index in the collection of selected rows and
25
+ # not the index in the collection of all the table's rows.
26
+ #
27
+ # @return [Row] the table's n'th selected row
28
+ def at(n)
29
+ super do |idx|
30
+ Row.new(@native, idx)
31
+ end
32
+ end
33
+
34
+ # @return [Integer] the number of selected rows
35
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-n-selected-rows atspi_table_get_n_selected_rows
36
+ def count
37
+ @native.n_selected_rows
38
+ end
39
+ # @!endgroup
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,31 @@
1
+ module ATSPI
2
+ class Accessible::Table
3
+ # Represents all rows in a {Table}
4
+ class Rows
5
+ include SelectableCollection
6
+
7
+ # @api private
8
+ def initialize(native)
9
+ @native = native
10
+ end
11
+
12
+ # @!group Enumerable interface
13
+ # @param idx [Integer]
14
+ #
15
+ # @return [Row] the row at index +idx+
16
+ def at(idx)
17
+ super do |mapped_idx|
18
+ Row.new(@native, mapped_idx)
19
+ end
20
+ end
21
+
22
+ # @return [Integer] its number of rows
23
+ #
24
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-n-rows atspi_table_get_n_rows
25
+ def count
26
+ @native.n_rows
27
+ end
28
+ # @!endgroup
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,50 @@
1
+ module ATSPI
2
+ # Wraps libatspi's AtspiTable[https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html].
3
+ class Accessible::Table
4
+ # @api private
5
+ def initialize(native)
6
+ @native = native
7
+ end
8
+
9
+ # @group Attributes
10
+ # @return [Accessible,nil] its caption
11
+ #
12
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-caption atspi_table_get_caption
13
+ def caption
14
+ Accessible.new(@native.caption) if @native.caption
15
+ end
16
+
17
+ # @return [Accessible,nil] its summary
18
+ #
19
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-summary atspi_table_get_summary
20
+ def summary
21
+ Accessible.new(@native.summary) if @native.caption
22
+ end
23
+ # @endgroup
24
+
25
+ # @group Parts
26
+ # @return [Rows] its rows
27
+ def rows
28
+ Rows.new(@native)
29
+ end
30
+
31
+ # @return [Columns] its columns
32
+ def columns
33
+ Columns.new(@native)
34
+ end
35
+
36
+ # @return [Cells] its cells
37
+ def cells
38
+ Cells.new(@native)
39
+ end
40
+ # @endgroup
41
+
42
+ # @group Representations
43
+ # @return [String] itself as an inspectable string
44
+ def inspect
45
+ "#<#{self.class.name}:0x#{'%x14' % __id__} @caption=#{caption.inspect} " <<
46
+ "@cells=#{cells.inspect} @rows=#{rows.inspect} @columns=#{columns.inspect}>"
47
+ end
48
+ # @endgroup
49
+ end
50
+ end
@@ -0,0 +1,31 @@
1
+ module ATSPI
2
+ class Accessible::Text
3
+ # Represents the caret in a {Text}.
4
+ class Caret < Offset
5
+ # @api private
6
+ def initialize(text_native)
7
+ @text_native = text_native
8
+ end
9
+
10
+ # @!group Actions
11
+ # @param offset [responds to #to_i]
12
+ #
13
+ # @return [true,false] indicating success
14
+ #
15
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#atspi-text-set-caret-offset atspi_text_set_caret_offset
16
+ def move_to(offset)
17
+ @text_native.set_caret_offset(offset.to_i)
18
+ end
19
+ # @!endgroup
20
+
21
+ # @!group Representations
22
+ # @return [Integer] its integer representation
23
+ #
24
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#atspi-text-get-caret-offset atspi_text_get_caret_offset
25
+ def to_i
26
+ @text_native.caret_offset
27
+ end
28
+ # @!endgroup
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,45 @@
1
+ module ATSPI
2
+ class Accessible::Text
3
+ # Represents a single character in a {Text}.
4
+ class Character
5
+ # @api private
6
+ def initialize(native, offset)
7
+ @native = native
8
+ @offset = offset
9
+ end
10
+
11
+ # @!group Attributes
12
+ # @return [1] its length
13
+ def length
14
+ 1
15
+ end
16
+
17
+ # @param relative_to [Symbol] coordinate system derived from
18
+ # libatspi's {https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiCoordType AtspiCoordType enum}
19
+ # by removing the prefix +ATSPI_COORD_TYPE+ and making it lowercase
20
+ #
21
+ # @return [Extents] its extents
22
+ #
23
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#atspi-text-get-character-extents atspi_text_get_character_extents
24
+ def extents(relative_to:)
25
+ Extents.new(@native.character_extents(@offset, relative_to))
26
+ end
27
+ # @!endgroup
28
+
29
+ # @!group Representations
30
+ # @return [String] its string representation
31
+ #
32
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#atspi-text-get-character-at-offset atspi_text_get_character_at_offset
33
+ def to_s
34
+ [@native.character_at_offset(@offset)].pack("U") # UCS-4 codepoint to readable character
35
+ end
36
+
37
+ # @return [String] itself as an inspectable string
38
+ def inspect
39
+ "#<#{self.class.name}:0x#{'%x14' % __id__} @to_s=#{to_s.inspect} @length=#{length} " <<
40
+ "@offset=#{@offset} @extents=#{extents(relative_to: :screen).inspect}>"
41
+ end
42
+ # @!endgroup
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,90 @@
1
+ class ATSPI::Accessible::Text
2
+ # Wraps libatspi's {https://developer.gnome.org/libatspi/stable/libatspi-atspi-editabletext.html#AtspiEditableText editable_text interface}.
3
+ module Editable
4
+ # @!group Attributes & States
5
+ # Checks if it is editable.
6
+ #
7
+ # @return [true,false]
8
+ #
9
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-editable-text atspi_accessible_get_editable_text_iface
10
+ def editable?
11
+ not @native.editable_text_iface.nil?
12
+ end
13
+ # @!endgroup
14
+
15
+ # @!group Actions
16
+ # Replaces its content with the given one. Will succeed only if it's
17
+ # editable.
18
+ #
19
+ # @param text [respond to #to_s] the new text
20
+ #
21
+ # @return [true,false] indicating success
22
+ def set_to(text)
23
+ delete && insert(text.to_s)
24
+ end
25
+
26
+ # Inserts a string at the given offset. Will succeed only if it's editable.
27
+ #
28
+ # @param text [respond to #to_s] the text to insert
29
+ # @param at [responds to #to_i] the offset to insert the string at
30
+ #
31
+ # @return [true,false] indicating success
32
+ #
33
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-editabletext.html#atspi-editable-text-insert-text atspi_editable_text_insert_text
34
+ def insert(text, at: caret)
35
+ editable? and @native.insert_text(at.to_i, text.to_s, text.to_s.length)
36
+ end
37
+
38
+ # Pastes the string in the clipboard at the given offset. Will succeed
39
+ # only if it's editable.
40
+ #
41
+ # @param at [responds to #to_i] the offset to insert the string at
42
+ #
43
+ # @return [true,false] indicating success
44
+ #
45
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-editabletext.html#atspi-editable-text-paste-text atspi_editable_text_paste_text
46
+ def paste(at: caret)
47
+ editable? and @native.paste_text(at.to_i)
48
+ end
49
+
50
+ # Copies its content in the given range into the clipboard. Will succeed
51
+ # only if it's editable.
52
+ #
53
+ # @param from [responds to #to_i] the start offset of the range
54
+ # @param to [responds to #to_i] the end offset of the range
55
+ #
56
+ # @return [true,false] indicating success
57
+ #
58
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-editabletext.html#atspi-editable-text-copy-text atspi_editable_text_copy_text
59
+ def copy(from: 0, to: length)
60
+ editable? and @native.copy_text(from.to_i, to.to_i)
61
+ end
62
+
63
+ # Cuts its content in the given range and puts it into the clipboard. Will
64
+ # succeed only if it's editable.
65
+ #
66
+ # @param from [responds to #to_i] the start offset of the range
67
+ # @param to [responds to #to_i] the end offset of the range
68
+ #
69
+ # @return [true,false] indicating success
70
+ #
71
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-editabletext.html#atspi-editable-text-cut-text atspi_editable_text_cut_text
72
+ def cut(from: 0, to: length)
73
+ editable? and @native.cut_text(from.to_i, to.to_i)
74
+ end
75
+
76
+ # Deletes its content in the given range. Will succeed only if it's
77
+ # editable.
78
+ #
79
+ # @param from [responds to #to_i] the start offset of the range
80
+ # @param to [responds to #to_i] the end offset of the range
81
+ #
82
+ # @return [true,false] indicating success
83
+ #
84
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-editabletext.html#atspi-editable-text-delete-text atspi_editable_text_delete_text
85
+ def delete(from: 0, to: length)
86
+ editable? and @native.delete_text(from.to_i, to.to_i)
87
+ end
88
+ # @!endgroup
89
+ end
90
+ end
@@ -0,0 +1,19 @@
1
+ class ATSPI::Accessible
2
+ class Text
3
+ # Represents a hyperlink in a {Text}.
4
+ class Hyperlink < Hyperlink
5
+ # @api private
6
+ def initialize(text_native, native)
7
+ @text_native = text_native
8
+ super(native)
9
+ end
10
+
11
+ # @return [Range] its range
12
+ #
13
+ # @see https://developer.gnome.org/libatspi/stable/AtspiHyperlink.html#atspi-hyperlink-get-index-range atspi_hyperlink_get_index_range
14
+ def range
15
+ Range.new(@text_native, @native.index_range)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,29 @@
1
+ class ATSPI::Accessible::Text
2
+ # Wraps libatspi's {https://developer.gnome.org/libatspi/stable/libatspi-atspi-hypertext.html#AtspiHypertext hypertext interface}.
3
+ module Hypertext
4
+ # @!group Attributes & States
5
+ # Checks if it is a hypertext.
6
+ #
7
+ # @return [true,false]
8
+ #
9
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-hypertext atspi_accessible_get_hypertext_iface
10
+ def hypertext?
11
+ not @native.hypertext_iface.nil?
12
+ end
13
+
14
+ # @return [Array<Hyperlink>] its hyperlinks. Will be an empty array if it
15
+ # is not a hypertext.
16
+ #
17
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-hypertext.html#atspi-hypertext-get-n-links atspi_hypertext_get_n_links
18
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-hypertext.html#atspi-hypertext-get-link atspi_hypertext_get_link
19
+ def hyperlinks
20
+ if hypertext?
21
+ @native.n_links.times.map{ |idx| Hyperlink.new(@native, @native.link(idx)) }
22
+ else
23
+ []
24
+ end
25
+ end
26
+ alias_method :links, :hyperlinks
27
+ # @!endgroup
28
+ end
29
+ end
@@ -0,0 +1,59 @@
1
+ module ATSPI
2
+ class Accessible::Text
3
+ # Represents an offset in a {Text}.
4
+ class Offset
5
+ # @api private
6
+ def initialize(text_native, offset)
7
+ @text_native = text_native
8
+ @offset = offset
9
+ end
10
+
11
+ # @!group Attributes
12
+ # @param boundary [Symbol] the boundary type derived from libatspi's
13
+ # {https://github.com/GNOME/at-spi2-core/blob/9439376bc09333e6baf7111d5246a7beff1f7a14/atspi/atspi-constants.h#L348 AtspiTextGranularity enum}
14
+ # by removing the prefix +ATSPI_TEXT_GRANULARITY_+ and making it lowercase
15
+ #
16
+ # @return [Range] the text between the closest boundary to the left and
17
+ # right
18
+ #
19
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#atspi-text-get-text-at-offset atspi_text_get_string_at_offset
20
+ def text_around(boundary)
21
+ Range.new(@text_native, @text_native.string_at_offset(to_i, boundary))
22
+ end
23
+
24
+ # @return [Character] its character
25
+ def character
26
+ Character.new(@text_native, to_i)
27
+ end
28
+
29
+ # @return [Hyperlink,nil] its hyperlink. Will be +nil+ if its text does
30
+ # not implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-hypertext hypertext interface}
31
+ # or there simply is no hyperlink at the offset.
32
+ #
33
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-hypertext atspi_accessible_get_hypertext
34
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-hypertext.html#atspi-hypertext-get-link-index atspi_hypertext_get_link_index
35
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-hypertext.html#atspi-hypertext-get-link atspi_hypertext_get_link
36
+ def hyperlink
37
+ if @text_native.hypertext_iface
38
+ idx = @text_native.link_index(to_i)
39
+ Hyperlink.new(@text_native, @text_native.link(idx)) if idx != -1
40
+ end
41
+ end
42
+ alias_method :link, :hyperlink
43
+ # @!endgroup
44
+
45
+ # @!group Representations
46
+ # @return [Integer] its integer representation
47
+ def to_i
48
+ @offset
49
+ end
50
+
51
+ # @return [String] itself as an inspectable string
52
+ def inspect
53
+ "#<#{self.class.name}:0x#{'%x14' % __id__} @to_i=#{to_i} " <<
54
+ "@character=#{character.to_s.inspect} @text_around=#{text_around(:word).to_s.inspect}>"
55
+ end
56
+ # @!endgroup
57
+ end
58
+ end
59
+ end