rex-text 0.2.48 → 0.2.49

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4e3ab248f34fa3b7917bad07015868aebb7e91af8af1a210fa90cb89da7b8edc
4
- data.tar.gz: 853d7652f999e24504754ad1416faed2a68377c0c29e4d74ff1189b2c7194f01
3
+ metadata.gz: 2dbca3eaa8e600c95598ce2e14261052aec73785652853b57ad9474f90d1e1b1
4
+ data.tar.gz: 1e9dd3118f755430e2605f31baa00fe89833827922ff6724ee500a30d9f2b815
5
5
  SHA512:
6
- metadata.gz: 5d49ba31b089bc450704c14d0d93f5b2a5c40519c4d324474fa6f8c27faacb8808f71c9f36f9c8baa519084b9f20e39b9569868504d061c422fa65fc3ed1e94e
7
- data.tar.gz: a11d6dbc2323b7e9e0aa92aa7bbdf8b67a2cbc1329ff637e4a4cfd047191ea347c58ae40bb6a5f0a4cfc614cf6e7c3561e9de629c1172e18c930534cdf5a7f25
6
+ metadata.gz: d88703aa90f25147e9a01ae1451af03f73a2eb42a026b3eb048d8b186f2ef5c7ed97c97b6f67f39c8c1ebef99292924177d2f50c9a3f67ee085ec0c8ce6bb9b7
7
+ data.tar.gz: 484fb54c5e7a289c4450cc165bb28d9ba53c85f2d471e0c1f60c87dc68ad99475e100243c734213358dfccf47a6fef9c563b6b832fbbb4d21d142b98fdb51c1b
checksums.yaml.gz.sig CHANGED
@@ -1,2 +1,2 @@
1
- 2�U�{��k�<؅���7�p���ʆ�H#��r��� ��zxj�2�x4����pDk�aw+ܹp`gP�"P4�g=��h � ��ֿc!��ɄbZ�
2
- ̆���rq�%g��z�����<!]�*��Kf�/�ϵ6�"wv5�.‘���/�$K�?6��C�:�L���B�!(RPT��1)M�[kN�A��\�n3����!�&�f/K���߼�|%�W)��{a�^�K��#029U� 
1
+ ai�ħ���{r�XZ,[CGw���EC�ӑ�U7)� 09-��*��ų�XE��&��������LKv@��2�o_��DK����.�~��*G��^�IOl����^�,��e��BF\Fr�h>�d$M�Z����8F�b`V��[y��y۾
2
+ 1Q"���H���dЕ�8��K sxh. �՟ yrU�fR來����p@T ������F7{����:��Rֳ땒_K0��% ���)��
@@ -1,5 +1,5 @@
1
1
  module Rex
2
2
  module Text
3
- VERSION = "0.2.48"
3
+ VERSION = "0.2.49"
4
4
  end
5
5
  end
@@ -56,13 +56,13 @@ class WrappedTable
56
56
  #
57
57
  # The text to affix to the end of the table.
58
58
  #
59
- # Sortindex
59
+ # SortIndex
60
60
  #
61
61
  # The column to sort the table on, -1 disables sorting.
62
62
  #
63
63
  # ColProps
64
64
  #
65
- # A hash specifying column MaxWidth, Stylers, and Formatters.
65
+ # A hash specifying column Width, Stylers, and Formatters.
66
66
  #
67
67
  def initialize(opts = {})
68
68
  self.header = opts['Header']
@@ -85,10 +85,11 @@ class WrappedTable
85
85
  # Default column properties
86
86
  self.columns.length.times { |idx|
87
87
  self.colprops[idx] = {}
88
- self.colprops[idx]['MaxWidth'] = self.columns[idx].length
88
+ self.colprops[idx]['Width'] = nil
89
89
  self.colprops[idx]['WordWrap'] = true
90
90
  self.colprops[idx]['Stylers'] = []
91
91
  self.colprops[idx]['Formatters'] = []
92
+ self.colprops[idx]['ColumnStylers'] = []
92
93
  }
93
94
 
94
95
  # ensure all our internal state gets updated with the given rows by
@@ -112,20 +113,28 @@ class WrappedTable
112
113
  # Converts table contents to a string.
113
114
  #
114
115
  def to_s
116
+ sort_rows
117
+
118
+ # Loop over and style columns
119
+ styled_columns = columns.map.with_index { |col, idx| style_table_column_headers(col, idx) }
120
+ # Loop over and style rows that are visible to the user
121
+ styled_rows = rows.select { |row| row_visible(row) }
122
+ .map! { |row| row.map.with_index { |cell, index| style_table_field(cell, index) } }
123
+
124
+ optimal_widths = calculate_optimal_widths(styled_columns, styled_rows)
125
+
115
126
  str = prefix.dup
116
127
  str << header_to_s || ''
117
- str << columns_to_s || ''
128
+ str << columns_to_s(styled_columns, optimal_widths) || ''
118
129
  str << hr_to_s || ''
119
130
 
120
- sort_rows
121
- rows.each { |row|
122
- if (is_hr(row))
131
+ styled_rows.each { |row|
132
+ if is_hr(row)
123
133
  str << hr_to_s
124
134
  else
125
- str << row_to_s(row) if row_visible(row)
135
+ str << row_to_s(row, optimal_widths)
126
136
  end
127
137
  }
128
-
129
138
  str << postfix
130
139
 
131
140
  return str
@@ -185,11 +194,6 @@ class WrappedTable
185
194
  formatted_fields = fields.map.with_index { |field, idx|
186
195
  field = format_table_field(field, idx)
187
196
 
188
- if (colprops[idx]['MaxWidth'] < display_width(field))
189
- old = colprops[idx]['MaxWidth']
190
- colprops[idx]['MaxWidth'] = display_width(field)
191
- end
192
-
193
197
  field
194
198
  }
195
199
 
@@ -333,7 +337,7 @@ protected
333
337
  #
334
338
  def row_visible(row)
335
339
  return true if self.scterm.nil?
336
- row_to_s(row).match(self.scterm)
340
+ row.join(' ').match(self.scterm)
337
341
  end
338
342
 
339
343
  #
@@ -354,8 +358,7 @@ protected
354
358
  #
355
359
  # Converts the columns to a string.
356
360
  #
357
- def columns_to_s # :nodoc:
358
- optimal_widths = calculate_optimal_widths
361
+ def columns_to_s(columns, optimal_widths) # :nodoc:
359
362
  values_as_chunks = chunk_values(columns, optimal_widths)
360
363
  result = chunks_to_s(values_as_chunks, optimal_widths)
361
364
 
@@ -389,9 +392,7 @@ protected
389
392
  #
390
393
  # Converts a row to a string.
391
394
  #
392
- def row_to_s(row) # :nodoc:
393
- row = row.each_with_index.map { |cell, index| style_table_field(cell, index) }
394
- optimal_widths = calculate_optimal_widths
395
+ def row_to_s(row, optimal_widths) # :nodoc:
395
396
  values_as_chunks = chunk_values(row, optimal_widths)
396
397
  chunks_to_s(values_as_chunks, optimal_widths)
397
398
  end
@@ -567,12 +568,26 @@ protected
567
568
  without_extra_column
568
569
  end
569
570
 
570
- def calculate_optimal_widths
571
- # Calculate the minimum width each column can be. This is dictated by the user.
571
+ def calculate_optimal_widths(styled_columns, styled_rows)
572
+ total_columns = self.colprops.length
573
+ # Calculate the display width metadata, i.e. the size of the longest strings in the table
574
+ display_width_metadata = Array.new(total_columns) { {} }
575
+ [[styled_columns], styled_rows].each do |group|
576
+ group.each do |row|
577
+ row.each.with_index do |cell, column_index|
578
+ metadata = display_width_metadata[column_index]
579
+ cell_display_width = display_width(cell)
580
+ if cell_display_width > (metadata[:max_display_width] || 0)
581
+ metadata[:max_display_width] = cell_display_width
582
+ end
583
+ end
584
+ end
585
+ end
586
+
587
+ # Calculate the sizes set by the user
572
588
  user_influenced_column_widths = colprops.map do |colprop|
573
- if colprop['WordWrap'] == false
574
- colprop['MaxWidth']
575
- raise 'Not implemented'
589
+ if colprop['Width']
590
+ colprop['Width']
576
591
  else
577
592
  nil
578
593
  end
@@ -583,15 +598,16 @@ protected
583
598
  remaining_column_calculations = user_influenced_column_widths.select(&:nil?).count
584
599
 
585
600
  # Calculate the initial widths, which will need an additional refinement to reallocate surplus space
586
- naive_optimal_width_calculations = colprops.map.with_index do |colprop, index|
601
+ naive_optimal_width_calculations = display_width_metadata.map.with_index do |display_size, index|
587
602
  shared_column_width = available_space / [remaining_column_calculations, 1].max
588
603
  remaining_column_calculations -= 1
589
604
 
605
+ # Preference the user defined widths first
590
606
  if user_influenced_column_widths[index]
591
607
  { width: user_influenced_column_widths[index], wrapped: false }
592
- elsif colprop['MaxWidth'] < shared_column_width
593
- available_space -= colprop['MaxWidth']
594
- { width: colprop['MaxWidth'], wrapped: false }
608
+ elsif display_size[:max_display_width] < shared_column_width
609
+ available_space -= display_size[:max_display_width]
610
+ { width: display_size[:max_display_width], wrapped: false }
595
611
  else
596
612
  available_space -= shared_column_width
597
613
  { width: shared_column_width, wrapped: true }
@@ -608,7 +624,7 @@ protected
608
624
  revisiting_column_counts -= 1
609
625
 
610
626
  if naive_width[:wrapped]
611
- max_width = colprops[index]['MaxWidth']
627
+ max_width = display_width_metadata[index][:max_display_width]
612
628
  if max_width < (naive_width[:width] + additional_column_width)
613
629
  surplus_width -= max_width - naive_width[:width]
614
630
  max_width
@@ -638,6 +654,16 @@ protected
638
654
  str_cp
639
655
  end
640
656
 
657
+ def style_table_column_headers(str, idx)
658
+ str_cp = str.dup
659
+
660
+ colprops[idx]['ColumnStylers'].each do |s|
661
+ str_cp = s.style(str_cp)
662
+ end
663
+
664
+ str_cp
665
+ end
666
+
641
667
  def style_table_field(str, idx)
642
668
  str_cp = str.dup
643
669
 
@@ -652,4 +678,3 @@ end
652
678
 
653
679
  end
654
680
  end
655
-
data/lib/rex/text.rb CHANGED
@@ -110,6 +110,8 @@ module Rex
110
110
  # @param [String] str
111
111
  # @return [Integer]
112
112
  def self.display_width(str)
113
+ return 0 if str.nil?
114
+
113
115
  str.gsub(COLOR_CODES_REGEX, '').length
114
116
  end
115
117
 
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rex-text
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.48
4
+ version: 0.2.49
5
5
  platform: ruby
6
6
  authors:
7
7
  - Metasploit Hackers
@@ -93,7 +93,7 @@ cert_chain:
93
93
  EknWpNgVhohbot1lfVAMmIhdtOVaRVcQQixWPwprDj/ydB8ryDMDosIMcw+fkoXU
94
94
  9GJsSaSRRYQ9UUkVL27b64okU8D48m8=
95
95
  -----END CERTIFICATE-----
96
- date: 2023-01-31 00:00:00.000000000 Z
96
+ date: 2023-02-02 00:00:00.000000000 Z
97
97
  dependencies:
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: rake
metadata.gz.sig CHANGED
Binary file