italian-ruby 0.9.14 → 1.0.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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.ruby-version +1 -1
  4. data/Gemfile.lock +2 -9
  5. data/bin/italian-rspec +9 -18
  6. data/bin/italian-ruby +7 -7
  7. data/{vim → dev/vim}/ftdetect/ir.vim +0 -0
  8. data/{vim → dev/vim}/syntax/ir.vim +0 -0
  9. data/{vim → dev/vim}/vimrc +0 -0
  10. data/{vscode → dev/vscode}/italianruby.tmGrammar.json +0 -0
  11. data/italian-ruby.gemspec +7 -6
  12. data/lib/italian/ruby.rb +39 -14
  13. data/lib/italian/ruby/alias.rb +28 -0
  14. data/lib/italian/ruby/{core_ext → alias}/array.rb +13 -80
  15. data/lib/italian/ruby/{core_ext → alias}/class.rb +9 -2
  16. data/lib/italian/ruby/{core_ext → alias}/date.rb +4 -35
  17. data/lib/italian/ruby/{core_ext → alias}/enumerator.rb +4 -5
  18. data/lib/italian/ruby/alias/error.rb +17 -0
  19. data/lib/italian/ruby/{core_ext → alias}/false_class.rb +4 -3
  20. data/lib/italian/ruby/{core_ext → alias}/file.rb +6 -9
  21. data/lib/italian/ruby/{core_ext → alias}/float.rb +3 -4
  22. data/lib/italian/ruby/{core_ext → alias}/hash.rb +4 -36
  23. data/lib/italian/ruby/{core_ext → alias}/integer.rb +2 -26
  24. data/lib/italian/ruby/alias/io.rb +7 -0
  25. data/lib/italian/ruby/alias/kernel.rb +9 -0
  26. data/lib/italian/ruby/{core_ext → alias}/main.rb +5 -23
  27. data/lib/italian/ruby/alias/module.rb +9 -0
  28. data/lib/italian/ruby/{core_ext → alias}/nil_class.rb +3 -5
  29. data/lib/italian/ruby/alias/numeric.rb +3 -0
  30. data/lib/italian/ruby/alias/object.rb +39 -0
  31. data/lib/italian/ruby/alias/open_struct.rb +3 -0
  32. data/lib/italian/ruby/{core_ext → alias}/proc.rb +4 -5
  33. data/lib/italian/ruby/{core_ext → alias}/range.rb +2 -7
  34. data/lib/italian/ruby/{core_ext → alias}/rational.rb +3 -4
  35. data/lib/italian/ruby/{core_ext/gems → alias}/rspec.rb +7 -61
  36. data/lib/italian/ruby/alias/set.rb +39 -0
  37. data/lib/italian/ruby/alias/socket.rb +30 -0
  38. data/lib/italian/ruby/{core_ext → alias}/string.rb +6 -65
  39. data/lib/italian/ruby/{core_ext → alias}/symbol.rb +4 -5
  40. data/lib/italian/ruby/alias/time.rb +26 -0
  41. data/lib/italian/ruby/{core_ext → alias}/true_class.rb +4 -3
  42. data/lib/italian/ruby/errori.rb +84 -0
  43. data/lib/italian/ruby/metodi.rb +16 -0
  44. data/lib/italian/ruby/metodi/array.rb +105 -0
  45. data/lib/italian/ruby/metodi/date.rb +37 -0
  46. data/lib/italian/ruby/metodi/hash.rb +57 -0
  47. data/lib/italian/ruby/metodi/integer.rb +45 -0
  48. data/lib/italian/ruby/metodi/json.rb +17 -0
  49. data/lib/italian/ruby/metodi/kernel.rb +86 -0
  50. data/lib/italian/ruby/metodi/main.rb +31 -0
  51. data/lib/italian/ruby/metodi/module.rb +46 -0
  52. data/lib/italian/ruby/metodi/nil_class.rb +11 -0
  53. data/lib/italian/ruby/metodi/object.rb +64 -0
  54. data/lib/italian/ruby/{core_ext → metodi}/open_struct.rb +5 -7
  55. data/lib/italian/ruby/metodi/range.rb +11 -0
  56. data/lib/italian/ruby/metodi/rspec.rb +64 -0
  57. data/lib/italian/ruby/metodi/string.rb +142 -0
  58. data/lib/italian/ruby/metodi/time.rb +51 -0
  59. data/lib/italian/ruby/traduttore.rb +93 -122
  60. data/lib/italian/ruby/traduttore/linea.rb +144 -0
  61. data/lib/italian/ruby/traduttore/pezzo.rb +106 -0
  62. data/lib/italian/ruby/traduttore/stringa.rb +76 -0
  63. data/lib/italian/ruby/{version.rb → versione.rb} +1 -1
  64. metadata +58 -43
  65. data/Rakefile +0 -6
  66. data/lib/italian/ruby/core_ext.rb +0 -32
  67. data/lib/italian/ruby/core_ext/errors.rb +0 -12
  68. data/lib/italian/ruby/core_ext/gems/bson.rb +0 -26
  69. data/lib/italian/ruby/core_ext/gems/fabrication.rb +0 -12
  70. data/lib/italian/ruby/core_ext/gems/hanami.rb +0 -66
  71. data/lib/italian/ruby/core_ext/gems/rack_test.rb +0 -15
  72. data/lib/italian/ruby/core_ext/json.rb +0 -11
  73. data/lib/italian/ruby/core_ext/kernel.rb +0 -111
  74. data/lib/italian/ruby/core_ext/module.rb +0 -32
  75. data/lib/italian/ruby/core_ext/numeric.rb +0 -6
  76. data/lib/italian/ruby/core_ext/object.rb +0 -79
  77. data/lib/italian/ruby/core_ext/time.rb +0 -69
  78. data/lib/italian/ruby/errore.rb +0 -52
  79. data/lib/italian/ruby/utils/debug.rb +0 -134
@@ -0,0 +1,142 @@
1
+ # frozen_string_literal: true
2
+
3
+ class String
4
+
5
+ ##
6
+ # Metodi per la colorizzazione delle stringhe,
7
+ # quando stampate a terminale.
8
+ def colorize(color_code)
9
+ "\e[#{color_code}m#{self}\e[0m"
10
+ end
11
+
12
+ def bianco
13
+ self
14
+ end
15
+
16
+ def rosso
17
+ colorize(31)
18
+ end
19
+
20
+ def verde
21
+ colorize(32)
22
+ end
23
+
24
+ def giallo
25
+ colorize(33)
26
+ end
27
+
28
+ def blu
29
+ colorize(34)
30
+ end
31
+
32
+ def magenta
33
+ colorize(35)
34
+ end
35
+
36
+ def azzurro
37
+ colorize(36)
38
+ end
39
+
40
+ def arancione
41
+ colorize("38;5;214")
42
+ end
43
+
44
+ ##
45
+ # Determina se la stringa esiste e non è vuota.
46
+ def esiste?
47
+ !nil? and self != ""
48
+ end
49
+
50
+ ##
51
+ # Determina se la stringa non include un'altra stringa.
52
+ def non_include?(*args)
53
+ !include? *args
54
+ end
55
+
56
+ ##
57
+ # Determina se la stringa non inizia con un'altra stringa.
58
+ def non_inizia_con?(*args)
59
+ !inizia_con? *args
60
+ end
61
+
62
+ ##
63
+ # Determina se la stringa non finisce con un'altra stringa.
64
+ def non_finisce_con?(*args)
65
+ !finisce_con? *args
66
+ end
67
+
68
+ ##
69
+ # Converte la stringa in data.
70
+ def in_data
71
+ return unless defined? Date
72
+ Date.parse self
73
+ end
74
+
75
+ ##
76
+ # Converte la stringa in tempo.
77
+ def in_tempo
78
+ return unless defined? Time
79
+ Time.parse self
80
+ end
81
+
82
+ ##
83
+ # Converte la stringa nella classe con lo steso nome.
84
+ def in_classe
85
+ Object.const_get self
86
+ end
87
+
88
+ ##
89
+ # Restituisce i primi n caratteri della stringa.
90
+ def primi(n)
91
+ self[0..(n - 1)]
92
+ end
93
+
94
+ ##
95
+ # Restituisce il primo carattere della stringa.
96
+ def primo_carattere
97
+ self[0]
98
+ end
99
+
100
+ ##
101
+ # Restituisce l'ultimo carattere della stringa.
102
+ def ultimo_carattere
103
+ self[-1]
104
+ end
105
+
106
+ ##
107
+ # Restituisce la stringa escludendo i primi n caratteri.
108
+ def salta_caratteri(n)
109
+ self[(n - 1)..-1]
110
+ end
111
+
112
+ ##
113
+ # Restituisce la stringa escludendo il primo carattere.
114
+ def salta_il_primo_carattere
115
+ self[1..-1]
116
+ end
117
+
118
+ ##
119
+ # Restituisce la stringa togliendo gli ultimi n caratteri.
120
+ def tronca_caratteri(n)
121
+ self[0..(-1 - n)]
122
+ end
123
+
124
+ ##
125
+ # Restituisce la stringa togliendo l'ultimo carattere.
126
+ def tronca
127
+ self[0..-2]
128
+ end
129
+
130
+ ##
131
+ # Adatta la stringa alla lunghezza specificata.
132
+ # Se la stringa è più lunga, la tronca e mette dei puntini di sospensione.
133
+ # Se la stringa è più corta, aggiunge n spazi vuoti alla fine per coprire.
134
+ def adatta(l)
135
+ if self.length > l
136
+ "#{self[0..l - 3]}.."
137
+ else
138
+ self.ljust l, " "
139
+ end
140
+ end
141
+
142
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Time
4
+
5
+ ##
6
+ # Converte il tempo in data.
7
+ def in_data
8
+ self.to_date
9
+ end
10
+
11
+ ##
12
+ # Converte il tempo in se stesso.
13
+ def in_tempo
14
+ self
15
+ end
16
+
17
+ ##
18
+ # Formatta il tempo secondo la stringa passata.
19
+ def formatta_locale(format)
20
+ if defined? I18n
21
+ I18n.l self, format: format
22
+ else
23
+ strftime format
24
+ end
25
+ end
26
+
27
+ ##
28
+ # Ritorna il tempo all'inizio dell'ora.
29
+ def inizio_ora
30
+ Time.new(self.year, self.month, self.day, self.hour)
31
+ end
32
+
33
+ ##
34
+ # Ritorna il tempo alla fine dell'ora.
35
+ def fine_ora
36
+ Time.new(self.year, self.month, self.day, self.hour, 59, 59)
37
+ end
38
+
39
+ ##
40
+ # Ritorna il tempo all'inizio del minuto.
41
+ def inizio_minuto
42
+ Time.new(self.year, self.month, self.day, self.hour, self.min)
43
+ end
44
+
45
+ ##
46
+ # Ritorna il tempo alla fine del minuto.
47
+ def fine_minuto
48
+ Time.new(self.year, self.month, self.day, self.hour, self.min, 59)
49
+ end
50
+
51
+ end
@@ -1,143 +1,114 @@
1
1
  # frozen_string_literal: true
2
- require "rainbow"
3
- require_relative "utils/debug"
4
- require_relative "errore"
5
-
2
+ require_relative "errori"
3
+ require_relative "traduttore/linea"
4
+
5
+ ##
6
+ # Traduttore per codice sorgente ItalianRuby.
7
+ #
8
+ # Il traduttore espone un metodo di classe `traduci`, che può
9
+ # essere chiamato passando un archivio o un blocco.
10
+ # Viene restituito lo stesso archivio o blocco tradotto in sorgente Ruby.
11
+ #
12
+ # Nella traduzione viene mantenuta la perfetta corrispondenza
13
+ # fra i numeri di linea, in modo tale da facilitare la lettura delle
14
+ # eventuali tracce di errore.
6
15
  module Italian
7
16
  module Ruby
8
17
  class Traduttore
9
18
 
19
+ ##
20
+ # Bandierina per stampare o meno i dettagli della traduzione,
21
+ # mentre questa viene eseguita.
10
22
  STAMPA_DETTAGLI_TRADUZIONE = false
11
23
 
12
- class << self
13
-
14
- def traduci(file = nil, &block)
15
- if not file.nil?
16
- codice_tradotto = File.readlines(file).map.with_index do |linea, riga|
17
- traduci_linea file, linea, riga
18
- end
19
- codice_tradotto.join
20
- else
21
- if block_given?
22
- begin
23
- block.call
24
- rescue StandardError => errore
25
- Italian::Ruby::Errore.new([ errore.message, errore.backtrace ].join("\n"), "-", 0, 0).stampa
26
- end
27
- end
28
- end
29
- end
24
+ ##
25
+ # Punto d'ingresso del traduttore. Questo metodo esegue del codice Ruby
26
+ # presente in un archivio. Il codice può essere stato precedentemente
27
+ # tradotto dal metodo `traduci` del traduttore ItalianRuby.
28
+ def self.esegui(percorso_archivio_tradotto)
29
+ load percorso_archivio_tradotto
30
+ rescue SyntaxError => errore
31
+ Italian::Ruby::Errori.recupera errore, percorso_archivio_tradotto
32
+ rescue StandardError => errore
33
+ Italian::Ruby::Errori.recupera errore, percorso_archivio_tradotto
34
+ end
30
35
 
31
- def traduci_linea(file, linea, riga)
32
- puts "Traduco linea [#{riga}]: #{linea.inspect}".magenta if STAMPA_DETTAGLI_TRADUZIONE
33
- posizione_commento = linea.index(%{#}) || linea.length
34
- posizione_stringa_singola = linea.index(%{'}) || linea.length
35
- posizione_stringa_doppia = linea.index(%{"}) || linea.length
36
- contesto = [
37
- file, linea, riga,
38
- posizione_commento,
39
- posizione_stringa_singola,
40
- posizione_stringa_doppia ]
41
-
42
- controlla_stringa_singola *contesto
43
- controlla_stringa_doppia *contesto
44
-
45
- if posizione_commento < posizione_stringa_doppia
46
- pezzi_da_tradurre = [
47
- linea[0..posizione_commento],
48
- linea[posizione_commento + 1..]
49
- ]
50
- elsif posizione_stringa_doppia < posizione_commento
51
- pezzi_da_tradurre = linea.scan( /([^"]*)("[^"]*")([^"]*)/ ).flatten
52
- else
53
- pezzi_da_tradurre = [ linea ]
54
- end
36
+ ##
37
+ # Punto d'ingresso del traduttore. Questo metodo accetta un archivio
38
+ # come argomento principale, oppure un blocco di codice.
39
+ def self.traduci(archivio = nil, sorgente = nil, &blocco)
40
+ return traduci_archivio archivio if archivio != nil
41
+ return traduci_sorgente sorgente if sorgente != nil
42
+ return traduci_blocco &blocco if block_given?
43
+ end
44
+
45
+ private
46
+
47
+ ##
48
+ # Traduce un archivio sorgente da ItalianRuby a Ruby.
49
+ # Salva la versione tradotta dell'archivio originale nel percorso
50
+ # delle traduzioni.
51
+ def self.traduci_archivio(archivio)
52
+ puts "Traduzione archivio: #{archivio}" if STAMPA_DETTAGLI_TRADUZIONE
55
53
 
56
- debug pezzi_da_tradurre if STAMPA_DETTAGLI_TRADUZIONE
57
- linea_tradotta = pezzi_da_tradurre.map { |pezzo| traduci_pezzo pezzo }.join
54
+ linee_sorgente = File.readlines archivio
55
+ linee_tradotte = linee_sorgente.map.with_index do |linea, numero_linea|
56
+ linea_da_tradurre = Italian::Ruby::Traduttore::Linea.new linea, numero_linea, archivio
57
+ linea_tradotta = linea_da_tradurre.traduci
58
58
 
59
- if STAMPA_DETTAGLI_TRADUZIONE
60
- puts "Linea tradotta [#{riga}]: #{linea_tradotta.inspect}".verde_lime
61
- puts
59
+ puts "\t[#{numero_linea}] <- #{linea}" if STAMPA_DETTAGLI_TRADUZIONE
60
+ puts "\t[#{numero_linea}] -> #{linea_tradotta}" if STAMPA_DETTAGLI_TRADUZIONE
61
+
62
+ linea_tradotta.chomp
62
63
  end
63
- linea_tradotta
64
+
65
+ puts "Traduzione terminata." if STAMPA_DETTAGLI_TRADUZIONE
66
+ puts if STAMPA_DETTAGLI_TRADUZIONE
67
+
68
+ linee_tradotte = linee_tradotte.join("\n").freeze
69
+ archivio_tradotto = Italian::Ruby.percorso_archivio_tradotto archivio
70
+ cartella_archivio_tradotto = File.dirname archivio_tradotto
71
+ FileUtils.mkdir_p cartella_archivio_tradotto unless Dir.exist? cartella_archivio_tradotto
72
+
73
+ File.write archivio_tradotto, linee_tradotte
74
+ archivio_tradotto
75
+ rescue SyntaxError => errore
76
+ Italian::Ruby::Errori.recupera errore, archivio
64
77
  end
65
78
 
66
- private
79
+ ##
80
+ # Traduce un pezzo di sorgente da ItalianRuby a Ruby.
81
+ def self.traduci_sorgente(sorgente)
82
+ puts "Traduzione sorgente." if STAMPA_DETTAGLI_TRADUZIONE
67
83
 
68
- def controlla_stringa_singola(file, linea, riga, posizione_commento, posizione_stringa_singola, posizione_stringa_doppia)
69
- if posizione_stringa_singola < posizione_commento and posizione_stringa_singola < posizione_stringa_doppia
70
- Italian::Ruby::Errore::NonSupportato.new(
71
- "Le stringhe con singolo apice non sono supportate.",
72
- file, riga, posizione_stringa_singola).stampa
73
- end
74
- end
84
+ linee_sorgente = sorgente.split "\n"
85
+ linee_tradotte = linee_sorgente.map.with_index do |linea, numero_linea|
86
+ linea_da_tradurre = Italian::Ruby::Traduttore::Linea.new linea, numero_linea, nil
87
+ linea_tradotta = linea_da_tradurre.traduci
75
88
 
76
- def controlla_stringa_doppia(file, linea, riga, posizione_commento, posizione_stringa_singola, posizione_stringa_doppia)
77
- return if posizione_commento <= posizione_stringa_doppia
78
-
79
- prossima_posizione_stringa_doppia = linea[posizione_stringa_doppia + 1..].index %{"}
80
- if prossima_posizione_stringa_doppia.nil?
81
- Italian::Ruby::Errore::IndividuazioneStringa.new(
82
- "Non è stato possibile trovare la terminazione della stringa.",
83
- file, riga, posizione_stringa_doppia).stampa
84
- end
85
- end
89
+ puts "\t[#{numero_linea}] <- #{linea}" if STAMPA_DETTAGLI_TRADUZIONE
90
+ puts "\t[#{numero_linea}] -> #{linea_tradotta}" if STAMPA_DETTAGLI_TRADUZIONE
86
91
 
87
- def traduci_pezzo(pezzo)
88
- return pezzo if pezzo.nil? or pezzo.length == 0
89
- return pezzo if pezzo.start_with? %{#}
90
- return pezzo if pezzo.start_with? %{"}
91
-
92
- pezzo.gsub! /(\b)e(\b)/, "\\1and\\2"
93
- pezzo.gsub! /(\b)inizia(\b)/, "\\1begin\\2"
94
- pezzo.gsub! /(\b)blocco_dato\?(\b)/, "\\1block_given?\\2"
95
- pezzo.gsub! /(\b)esci(\b)/, "\\1break\\2"
96
- pezzo.gsub! /(\b)considera(\b)/, "\\1case\\2"
97
- pezzo.gsub! /(\b)classe([\s]+[A-Z][\w]*)/, "\\1class\\2"
98
- pezzo.gsub! /(\b)classe([\s]+)(<<)([\s]+)/, "\\1class\\2\\3\\4"
99
- pezzo.gsub! /(\b)definisci([\s]+[^\s]+)/, "\\1def\\2"
100
- pezzo.gsub! /(\b)definito\?([\s]+[^\s]+)/, "\\1defined?\\2"
101
- pezzo.gsub! /(\b)definita\?([\s]+[^\s]+)/, "\\1defined?\\2"
102
- pezzo.gsub! /(\b)esegui(\b)/, "\\1do\\2"
103
- pezzo.gsub! /(\b)altrimenti(\b)/, "\\1else\\2"
104
- pezzo.gsub! /(\b)altrimenti_se(\b)/, "\\1elsif\\2"
105
- pezzo.gsub! /(\b)fine(\b)/, "\\1end\\2"
106
- pezzo.gsub! /(\b)assicura(\b)/, "\\1ensure\\2"
107
- pezzo.gsub! /(\b)estendi([\s]+[A-Z][\w]*)/, "\\1extend\\2"
108
- pezzo.gsub! /(\b)no(\b)/, "\\1false\\2"
109
- pezzo.gsub! /(\b)falso(\b)/, "\\1false\\2"
110
- pezzo.gsub! /(\b)per(\b)/, "\\1for\\2"
111
- pezzo.gsub! /(\b)se(\b)/, "\\1if\\2"
112
- pezzo.gsub! /(\b)includi([\s]+[A-Z][\w]*)/, "\\1include\\2"
113
- pezzo.gsub! /(\b)modulo([\s]+[A-Z][\w]*)/, "\\1module\\2"
114
- pezzo.gsub! /(\b)prossimo(\b)/, "\\1next\\2"
115
- pezzo.gsub! /(\b)prossima(\b)/, "\\1next\\2"
116
- pezzo.gsub! /(\b)nullo(\b)/, "\\1nil\\2"
117
- pezzo.gsub! /(\b)nulla(\b)/, "\\1nil\\2"
118
- pezzo.gsub! /(\b)non(\b)/, "\\1not\\2"
119
- pezzo.gsub! /(\b)o(\b)/, "\\1or\\2"
120
- pezzo.gsub! /(\b)preponi([\s]+[A-Z][\w]*)/, "\\1prepend\\2"
121
- pezzo.gsub! /(\b)riesegui(\b)/, "\\1redo\\2"
122
- pezzo.gsub! /(\b)recupera(\b)/, "\\1rescue\\2"
123
- pezzo.gsub! /(\b)riprova(\b)/, "\\1retry\\2"
124
- pezzo.gsub! /(\b)ritorna(\b)/, "\\1return\\2"
125
- pezzo.gsub! /(\b)istanza/, "\\1self"
126
- pezzo.gsub! /(\b)se_stesso/, "\\1self"
127
- pezzo.gsub! /(\b)se_stessa/, "\\1self"
128
- pezzo.gsub! /(\b)allora(\b)/, "\\1then\\2"
129
- pezzo.gsub! /(\b)si(\b)/, "\\1true\\2"
130
- pezzo.gsub! /(\b)vero(\b)/, "\\1true\\2"
131
- pezzo.gsub! /(\b)a_meno_che(\b)/, "\\1unless\\2"
132
- pezzo.gsub! /(\b)finché(\b)/, "\\1until\\2"
133
- pezzo.gsub! /(\b)quando(\b)/, "\\1when\\2"
134
- pezzo.gsub! /(\b)mentre(\b)/, "\\1while\\2"
135
- pezzo.gsub! /(\b)rilascia(\b)/, "\\1yield\\2"
136
- pezzo
92
+ linea_tradotta.chomp
137
93
  end
138
94
 
139
- end
95
+ puts "Traduzione terminata." if STAMPA_DETTAGLI_TRADUZIONE
96
+ puts if STAMPA_DETTAGLI_TRADUZIONE
97
+
98
+ sorgente_tradotto = linee_tradotte.join("\n").freeze
99
+ sorgente_tradotto
100
+ end
101
+
102
+ ##
103
+ # Traduce un blocco di codice da ItalianRuby a Ruby.
104
+ def self.traduci_blocco(&blocco)
105
+ blocco.call
106
+ rescue SyntaxError => errore
107
+ Italian::Ruby::Errori.recupera errore
108
+ rescue StandardError => errore
109
+ Italian::Ruby::Errori.recupera errore
110
+ end
140
111
 
141
112
  end
142
113
  end
143
- end
114
+ end
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+ require_relative "stringa"
3
+ require_relative "pezzo"
4
+
5
+ ##
6
+ # La classe Linea rappresenta una linea di codice sorgente scritta
7
+ # in ItalianRuby.
8
+ #
9
+ # Una Linea espone il metodo `traduci`, che quando chiamato, effettua
10
+ # la traduzione della linea in sorgente Ruby.
11
+ #
12
+ # La traduzione viene fatta cercando se nella linea ci sono stringhe
13
+ # o commenti. Nel caso in cui siano presenti commenti, che iniziano prima di
14
+ # ogni altra stringa, tutta la parte di commento viene restituita come tale.
15
+ # Se invece vengono trovate delle stringhe, che iniziano prima
16
+ # dell'eventuale commento, esse vengono gestite in modo separato.
17
+ #
18
+ # Per ogni stringa, se essa è interpolabile, viene ricercato se è presente
19
+ # un'interpolazione. Se trovata, essa viene re-interpretata come
20
+ # una nuova Linea. Altrimenti, la stringa viene restituita come tale.
21
+ module Italian
22
+ module Ruby
23
+ class Traduttore
24
+ class Linea
25
+
26
+ def initialize(contenuto, indice, nome_archivio)
27
+ @contenuto = contenuto
28
+ @indice = indice
29
+ @nome_archivio = nome_archivio
30
+
31
+ trova_posizione_primo_commento
32
+ trova_posizioni_stringhe
33
+ end
34
+
35
+ ##
36
+ # Traduce la linea in codice Ruby.
37
+ def traduci
38
+ @pezzi_da_tradurre = []
39
+
40
+ if @posizione_primo_commento != nil
41
+ if @stringhe.none? or @posizione_primo_commento < @stringhe[0].posizione_iniziale
42
+ dividi_usando_posizione_commento
43
+ else
44
+ dividi_usando_posizioni_stringhe
45
+ end
46
+ else
47
+ if @stringhe.none?
48
+ dividi_in_pezzo_unico
49
+ else
50
+ dividi_usando_posizioni_stringhe
51
+ end
52
+ end
53
+
54
+ @pezzi_da_tradurre.map(&:traduci).join
55
+ end
56
+
57
+ private
58
+
59
+ ##
60
+ # Trova la posizione del primo commento all'interno della linea.
61
+ def trova_posizione_primo_commento
62
+ @posizione_primo_commento = @contenuto.index "#"
63
+ end
64
+
65
+ ##
66
+ # Trova le strighe all'interno della linea. Le stringhe possono iniziare
67
+ # con il doppio apice ("), il singolo apice ('), o il percentuale-graffa (%{).
68
+ def trova_posizioni_stringhe
69
+ @stringhe = []
70
+
71
+ stringa_trovata = trova_prossima_stringa_partendo_da 0
72
+
73
+ while stringa_trovata != nil
74
+ @stringhe << stringa_trovata
75
+
76
+ inizio_nuova_ricerca = stringa_trovata.posizione_finale + 1
77
+ stringa_trovata = trova_prossima_stringa_partendo_da inizio_nuova_ricerca
78
+ end
79
+ end
80
+
81
+ ##
82
+ # Trova la prossima stringa sul contenuto, partendo dalla posizione indicata.
83
+ def trova_prossima_stringa_partendo_da(posizione_partenza)
84
+ tipo_stringa_corrente = nil
85
+ posizione_inizio_stringa = @contenuto.index /['"]|%\{/, posizione_partenza
86
+ return nil if posizione_inizio_stringa.nil?
87
+ return nil if @posizione_primo_commento != nil && @posizione_primo_commento < posizione_inizio_stringa
88
+
89
+ stringa_da_chiudere = Italian::Ruby::Traduttore::Stringa.new @contenuto, posizione_inizio_stringa
90
+ stringa_da_chiudere.ricerca_chiusura
91
+ stringa_da_chiudere
92
+ rescue Italian::Ruby::Errori::StringaNonTerminata => errore
93
+ Italian::Ruby::Errori.recupera errore, @nome_archivio, @indice + 1
94
+ end
95
+
96
+ ##
97
+ # Divide la linea in un pezzo unico, che contiene se stessa.
98
+ def dividi_in_pezzo_unico
99
+ @pezzi_da_tradurre = [ Italian::Ruby::Traduttore::Pezzo.new(@contenuto) ]
100
+ end
101
+
102
+ ##
103
+ # Divide la linea in pezzi, usando la posizione del commento.
104
+ def dividi_usando_posizione_commento
105
+ if @posizione_primo_commento == 0
106
+ @pezzi_da_tradurre = [ Italian::Ruby::Traduttore::Pezzo.new(@contenuto) ]
107
+ return
108
+ end
109
+
110
+ @pezzi_da_tradurre = [
111
+ Italian::Ruby::Traduttore::Pezzo.new(@contenuto[0..@posizione_primo_commento - 1]),
112
+ Italian::Ruby::Traduttore::Pezzo.new(@contenuto[@posizione_primo_commento..])
113
+ ]
114
+ end
115
+
116
+ ##
117
+ # Divide la linea in pezzi, usando le posizioni delle stringhe trovate.
118
+ def dividi_usando_posizioni_stringhe
119
+ @pezzi_da_tradurre = []
120
+ cursore_contenuto = 0
121
+
122
+ @stringhe.each do |stringa|
123
+ unless stringa.posizione_iniziale == cursore_contenuto
124
+ pezzo_non_stringa = @contenuto[cursore_contenuto..stringa.posizione_iniziale - 1]
125
+ @pezzi_da_tradurre << Italian::Ruby::Traduttore::Pezzo.new(pezzo_non_stringa)
126
+ end
127
+
128
+ pezzo_stringa = @contenuto[stringa.posizione_iniziale..stringa.posizione_finale]
129
+ @pezzi_da_tradurre << Italian::Ruby::Traduttore::Pezzo.new(pezzo_stringa)
130
+ cursore_contenuto = stringa.posizione_finale + 1
131
+ end
132
+
133
+ if cursore_contenuto < @contenuto.length - 1
134
+ pezzo_non_stringa = @contenuto[cursore_contenuto..]
135
+ @pezzi_da_tradurre << Italian::Ruby::Traduttore::Pezzo.new(pezzo_non_stringa)
136
+ end
137
+
138
+ @pezzi_da_tradurre
139
+ end
140
+
141
+ end
142
+ end
143
+ end
144
+ end