burek 0.5.2 → 0.5.3

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.
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ burek
2
+ =====
3
+
4
+ A ruby/rails gem for managing translations easy way.
data/lib/config.rb CHANGED
@@ -17,4 +17,5 @@ module Burek
17
17
  raise 'Unknown config key!' unless @@config_hash.has_key? key
18
18
  @@config_hash[key]
19
19
  end
20
+
20
21
  end
@@ -0,0 +1,56 @@
1
+ require 'file_helpers'
2
+
3
+ module Burek
4
+ module Finder
5
+
6
+ # Searches all files within search folders for burek calls.
7
+ #
8
+ # ==== Returns
9
+ # Hash in whichs values represent burek call captions and keys represent locales file paths in which
10
+ # those captions were found
11
+ #
12
+ def self.find_burek_calls_in_files
13
+ new_translations = {}
14
+ Burek::FileHelpers.open_each_file do |contents, file_name|
15
+ filtered_path = filter_path(file_name)
16
+ matches = find_burek_calls(contents)
17
+ matches.each do |caption|
18
+ key = filtered_path + "/" + caption.downcase.gsub(' ','_')
19
+ new_translations[key] = caption
20
+ end
21
+ end
22
+ return new_translations
23
+ end
24
+
25
+
26
+ # Finds burek calls in a string
27
+ #
28
+ # ==== Attributes
29
+ # * +string+ - A string that (possibly) contains burek calls
30
+ #
31
+ # ==== Returns
32
+ # Array of burek call captions
33
+ #
34
+ def self.find_burek_calls(string)
35
+ string.scan(Burek::Core.burek_call_regex).flatten
36
+ end
37
+
38
+ # Removes file extension from a path as well as any folder that is specified as ignored folder in config
39
+ #
40
+ # ==== Attributes
41
+ # * +file_name+ - path in string format that needs to be filtered
42
+ #
43
+ # ==== Returns
44
+ # Filtered path as a string
45
+ #
46
+ def self.filter_path(file_name)
47
+ path = file_name.split('/')
48
+ path.delete_if do |item|
49
+ Burek.config(:ignore_folders_for_key).include? item
50
+ end
51
+ path.last.gsub!(/\.(.*?)$/,'').gsub!(/^_/,'') #strip extenison from file name
52
+ return path.join('/')
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,32 @@
1
+ require 'file_helpers'
2
+ require 'core/burek_finder'
3
+
4
+ module Burek
5
+ module Replacer
6
+
7
+ def self.replace_burek_calls_in_files(to_replace)
8
+ Burek::FileHelpers.open_each_file do |content,file_name|
9
+ processed_content = replace_burek_calls(content, to_replace)
10
+ unless processed_content.nil?
11
+ File.open(file_name, 'w') do |output_file|
12
+ output_file.print processed_content
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ def self.replace_burek_calls(contents, to_replace)
19
+ matches = Burek::Finder.find_burek_calls(contents)
20
+ changes_made = false
21
+ matches.each do |value|
22
+ if to_replace.has_key?(value)
23
+ contents.gsub!(Burek::Core.burek_call_regex(value)," t('#{to_replace[value]}')")
24
+ changes_made = true
25
+ end
26
+ end
27
+
28
+ return contents if changes_made
29
+ end
30
+
31
+ end
32
+ end
data/lib/core/core.rb ADDED
@@ -0,0 +1,43 @@
1
+ require 'config'
2
+ require 'yaml'
3
+ require 'core/burek_replacer'
4
+ require 'core/burek_finder'
5
+ require 'core/locales_creator'
6
+ require 'file_helpers'
7
+
8
+ module Burek
9
+
10
+ module Core
11
+
12
+ # Main method in burek. It works in three steps:
13
+ #
14
+ # 1. find all burek calls within folders specified in config
15
+ # 2. add new translations to locales files
16
+ # 3. replace all burek calls with regular translation calls
17
+ #
18
+ def self.run_burek
19
+ Burek::FileHelpers.create_folder_if_missing Burek.config(:translations_path)
20
+
21
+ new_translations = Burek::Finder.find_burek_calls_in_files
22
+ to_replace = Burek::LocalesCreator.create_locales(new_translations)
23
+ Burek::Replacer.replace_burek_calls_in_files(to_replace)
24
+ end
25
+
26
+ # A regex for finiding burek calls
27
+ #
28
+ # It is used by Burek::Finder and Burek::Replacer.
29
+ # Example calls it can find
30
+ # * burek('Hello world')
31
+ # * burek("Hello world")
32
+ # * burek ( "Hello world" )
33
+ #
34
+ # ==== Attributes
35
+ # * +caption+ - Use it to find burek call with specific caption.
36
+ # By default it will accept any string and capture it in group named 'key'.
37
+ #
38
+ def self.burek_call_regex(caption="(?<key>[^\\)]*)")
39
+ Regexp.new("[^a-zA-Z0-9_]burek[ \\t]*\\([ \\t]*('|\")#{caption}\('|\")[^\\)]*\\)")
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,114 @@
1
+ module Burek
2
+ module LocalesCreator
3
+
4
+ # Creates new or updates exisitng locales files. Called by Burek::Finder
5
+ #
6
+ # ==== Attributes
7
+ # * +new_translations+ - A hash of new translations that were found in search folders.
8
+ # Values represent burek call captions and keys represent locales file paths in which those captions were found.
9
+ #
10
+ # ==== Returns
11
+ # A hash of burek calls that need to be replaced by translation calls.
12
+ # Keys contain captions of burek calls and values contain key which translation keys should contain.
13
+ #
14
+ def self.create_locales(new_translations)
15
+ to_replace = {}
16
+ # Create files for each locale
17
+ Burek.config(:locales).each do |locale|
18
+ new_translations.each do |key,value|
19
+ path_parts = key.split("/")
20
+ item_name = path_parts.pop
21
+ path_parts_no_filename = path_parts[0..-2]
22
+
23
+ translation_file = key_to_file_path(key, locale)
24
+ translations_hash = initialize_translations_hash(translation_file, locale)
25
+
26
+ # Save info for replacing burek calls with translation calls.
27
+ # Keys are burek call captions and values are keys to be used in translation calls.
28
+ to_replace[value] = path_parts_to_key(path_parts_no_filename, item_name)
29
+
30
+ # Nest in hashes
31
+ cur_hash = translations_hash[locale.dup.force_encoding("UTF-8")]
32
+ path_parts_no_filename.each do |item|
33
+ cur_hash[item] = {} unless cur_hash.has_key?(item)
34
+ cur_hash = cur_hash[item]
35
+ end
36
+ cur_hash[item_name] = ( locale == Burek.config(:locales).first ? value.dup.force_encoding("UTF-8") : Burek.config(:translation_placeholder) )
37
+
38
+ # Save to file
39
+ Burek::LocalesCreator.translations_hash_to_file(translations_hash, translation_file)
40
+ end
41
+ end
42
+
43
+ return to_replace
44
+ end
45
+
46
+ # Stores a translation hash in to a file
47
+ #
48
+ def self.translations_hash_to_file(translations_hash, translation_file)
49
+ clean_yaml = yaml_to_i18n_file(translations_hash.to_yaml)
50
+ translation_file.gsub!("//","/")
51
+ File.write(translation_file, clean_yaml) #Store
52
+ end
53
+
54
+ # Removes a first line from a yaml file which is added to standard YAML files
55
+ # but rails does not like it. It continas ---- or something like that
56
+ #
57
+ def self.yaml_to_i18n_file(yaml)
58
+ yaml.lines.to_a[1..-1].join
59
+ end
60
+
61
+ # Intializes a translation hash by either loading existing translation file
62
+ # or creating a hash that contains an empty hash under key which is name of current locale.
63
+ def self.initialize_translations_hash(translation_file, locale)
64
+ if File.exists?(translation_file)
65
+ translations_hash = YAML::load_file(translation_file) #Load
66
+ else
67
+ translations_hash = {}
68
+ translations_hash[locale.dup.force_encoding("UTF-8")] = {}
69
+ end
70
+ return translations_hash
71
+ end
72
+
73
+ # Creates a translation call key from path where burek call was found and burek call caption
74
+ #
75
+ def self.path_parts_to_key(path_parts, item_name)
76
+ regular_translation_key = path_parts.join('.')
77
+ regular_translation_key += "." unless regular_translation_key.nil? || regular_translation_key.empty?
78
+ regular_translation_key += "#{item_name}"
79
+ end
80
+
81
+ # Generates a file path to locales file from a file path where burek call was found.
82
+ # It will nest locales file under same subfolders in which burek call was found.
83
+ # If burek call was nested deeper then defined as subfolder depth limit in config file
84
+ # it will nest it under first X folders (where x is subfolder depth limit)
85
+ #
86
+ # ==== Attributes
87
+ # * +key+ - file path where burek call was found
88
+ # * +locale+ - locale for which this file is created
89
+ #
90
+ # ==== Returns
91
+ # A string that contains a path where locale file should be created.
92
+ # NOTE: Even though subfolders are created, the actuall locale file is NOT created.
93
+ #
94
+ def self.key_to_file_path(key, locale)
95
+ path_parts = key.split("/")
96
+ path_parts.pop
97
+
98
+ translation_file = Burek.config(:translations_path)
99
+ path_parts.each_with_index do |item, index|
100
+ if index == Burek.config(:subfolder_depth) || item == path_parts.last
101
+ translation_file += "#{item}.#{locale}.yml"
102
+ break
103
+ else
104
+ translation_file += "/#{item}/"
105
+ unless File.directory?(translation_file)
106
+ Dir.mkdir(translation_file)
107
+ end
108
+ end
109
+ end
110
+ return translation_file
111
+ end
112
+
113
+ end
114
+ end
@@ -0,0 +1,28 @@
1
+ module Burek
2
+ module FileHelpers
3
+
4
+ def self.open_each_file
5
+ for_each_file do |file_name|
6
+ File.open(file_name, "rb") do |file|
7
+ contents = file.read
8
+ yield contents, file_name
9
+ end
10
+ end
11
+ end
12
+
13
+ def self.for_each_file
14
+ Burek.config(:search_folders).each do |folder|
15
+ Dir.glob(folder) do |file_name|
16
+ unless File.directory?(file_name)
17
+ yield file_name
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ def self.create_folder_if_missing(path)
24
+ Dir.mkdir(path) unless File.directory?(path)
25
+ end
26
+
27
+ end
28
+ end
File without changes
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: burek
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.5.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -17,12 +17,16 @@ executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
+ - tasks/tasks.rb
20
21
  - lib/burek.rb
21
22
  - lib/config.rb
22
- - lib/core.rb
23
- - lib/parser.rb
24
- - lib/view_helpers.rb
25
- - tasks/tasks.rb
23
+ - lib/core/burek_finder.rb
24
+ - lib/core/burek_replacer.rb
25
+ - lib/core/core.rb
26
+ - lib/core/locales_creator.rb
27
+ - lib/file_helpers.rb
28
+ - lib/rails/view_helpers.rb
29
+ - README.md
26
30
  homepage: https://github.com/dabrorius/burek
27
31
  licenses:
28
32
  - MIT
data/lib/core.rb DELETED
@@ -1,122 +0,0 @@
1
- require 'config'
2
- require 'yaml'
3
-
4
- module Burek
5
-
6
- module Core
7
-
8
- def self.key_to_file_path(key, locale)
9
- path_parts = key.split("/")
10
- path_parts.pop
11
-
12
- translation_file = Burek.config(:translations_path)
13
- path_parts.each_with_index do |item, index|
14
- if index == Burek.config(:subfolder_depth) || item == path_parts.last
15
- translation_file += "#{item}.#{locale}.yml"
16
- break
17
- else
18
- translation_file += "/#{item}/"
19
- unless File.directory?(translation_file)
20
- Dir.mkdir(translation_file)
21
- end
22
- end
23
- end
24
- return translation_file
25
- end
26
-
27
- def self.filter_path(file_name)
28
- path = file_name.split('/')
29
- path.delete_if do |item|
30
- Burek.config(:ignore_folders_for_key).include? item
31
- end
32
- path.last.gsub!(/\.(.*?)$/,'').gsub!(/^_/,'') #strip extenison from file name
33
- return path.join('/')
34
- end
35
-
36
- def self.run_burek
37
- # Create translations folder if missing
38
- unless File.directory?(Burek.config(:translations_path))
39
- Dir.mkdir(Burek.config(:translations_path))
40
- end
41
-
42
- new_translations = {}
43
- # Iterate all defined subfolders subfolders
44
- for_each_file do |file_name|
45
- File.open(file_name, "rb") do |file|
46
- contents = file.read
47
-
48
- filtered_path = Burek::Core.filter_path(file_name)
49
- matches = Burek::Parser.find_burek_calls(contents)
50
- matches.each do |value|
51
- key = filtered_path + "/" + value.downcase.gsub(' ','_')
52
- new_translations[key] = value
53
- end
54
- end
55
- end
56
-
57
- to_replace = {}
58
- # Create files for each locale
59
- Burek.config(:locales).each do |locale|
60
- new_translations.each do |key,value|
61
- path_parts = key.split("/")
62
- item_name = path_parts.pop
63
- path_parts_no_filename = path_parts[0..-2]
64
-
65
- # Figure out file path
66
- translation_file = Burek::Core.key_to_file_path(key, locale)
67
-
68
- # Initialize translations hash
69
- if File.exists?(translation_file)
70
- translations_hash = YAML::load_file(translation_file) #Load
71
- else
72
- translations_hash = {}
73
- translations_hash[locale.dup.force_encoding("UTF-8")] = {}
74
- end
75
-
76
- # Save info for replacing burek calls with translation calls
77
- regular_translation_key = path_parts_no_filename.join('.') + ".#{item_name}"
78
- to_replace[value] = regular_translation_key
79
-
80
- # Nest in hashes
81
- cur_hash = translations_hash[locale.dup.force_encoding("UTF-8")]
82
- path_parts_no_filename.each do |item|
83
- cur_hash[item] = {} unless cur_hash.has_key?(item)
84
- cur_hash = cur_hash[item]
85
- end
86
- cur_hash[item_name] = ( locale == Burek.config(:locales).first ? value.dup.force_encoding("UTF-8") : Burek.config(:translation_placeholder) )
87
-
88
- # Save to file
89
- clean_yaml = Burek::Parser.yaml_to_i18n_file(translations_hash.to_yaml)
90
- translation_file.gsub!("//","/")
91
- File.write(translation_file, clean_yaml) #Store
92
- end
93
-
94
-
95
- end
96
-
97
- # Replace all burek calls with regular translation calls
98
- for_each_file do |file_name|
99
- File.open(file_name, 'r') do |file|
100
- content = file.read
101
- processed_content = Burek::Parser.replace_burek_calls(content, to_replace)
102
- unless processed_content.nil?
103
- File.open(file_name, 'w') do |output_file|
104
- output_file.print processed_content
105
- end
106
- end
107
- end
108
- end
109
- end
110
-
111
- def self.for_each_file
112
- Burek.config(:search_folders).each do |folder|
113
- Dir.glob(folder) do |file_name|
114
- unless File.directory?(file_name)
115
- yield file_name
116
- end
117
- end
118
- end
119
- end
120
-
121
- end
122
- end
data/lib/parser.rb DELETED
@@ -1,33 +0,0 @@
1
- module Burek
2
-
3
- module Parser
4
-
5
- def self.find_burek_calls(string)
6
- string.scan(burek_call_regex).flatten
7
- end
8
-
9
- def self.replace_burek_calls(contents, to_replace)
10
- matches = find_burek_calls(contents)
11
- changes_made = false
12
- matches.each do |value|
13
- if to_replace.has_key?(value)
14
- contents.gsub!(burek_call_regex(value)," t('#{to_replace[value]}')")
15
- changes_made = true
16
- end
17
- end
18
-
19
- return contents if changes_made
20
- end
21
-
22
- def self.yaml_to_i18n_file(yaml)
23
- yaml.lines.to_a[1..-1].join
24
- end
25
-
26
- private
27
-
28
- def self.burek_call_regex(caption="(?<key>[^\\)]*)")
29
- Regexp.new("[^a-zA-Z0-9_]burek[ \\t]*\\([ \\t]*('|\")#{caption}\('|\")[^\\)]*\\)")
30
- end
31
-
32
- end
33
- end