po_scanner.erl 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. %% Author: dave
  2. %% Created: Mar 1, 2010
  3. %% Description: TODO: Add description to po_scanner
  4. -module(po_scanner).
  5. %%
  6. %% Include files
  7. %%
  8. %%
  9. %% Exported Functions
  10. %%
  11. -export([scan/1]).
  12. %%
  13. %% API Functions
  14. %%
  15. scan(Path) ->
  16. case file:read_file(Path) of
  17. {ok,File} ->
  18. Template = binary_to_list(File),
  19. scan(Template, [], {1, 1}, [in_text]);
  20. _Error ->
  21. io:format("No po file found at path ~p~n",[Path]),
  22. []
  23. end.
  24. scan("#" ++ T, Scanned, {Row, Column}, Status = [in_text]) ->
  25. scan(T, Scanned, {Row, Column + 1}, lists:append([{in_comment, []}],Status));
  26. scan("\n" ++ T, Scanned, {Row, _Column}, [{in_comment, Comment}|Status]) ->
  27. scan(T, lists:append(Scanned, [{comment, Comment}]), {Row +1 , 1}, Status);
  28. scan([Head | T], Scanned, {Row, Column}, _Status = [{in_comment, Comment}|Stack]) ->
  29. NewStatus = lists:append([{in_comment, lists:append(Comment,[Head])}],Stack),
  30. scan(T, Scanned, {Row, Column + 1}, NewStatus);
  31. %%Msg id
  32. scan("msgid" ++ T, Scanned, {Row, Column}, Status = [in_text]) ->
  33. scan(T, Scanned, {Row, Column + 5}, lists:append([{in_message_id, []}],Status));
  34. %%scan("msgid" ++ T, Scanned, {Row, Column}, [{in_message_str, Body}|Stack]) ->
  35. %% scan(T, lists:append(Scanned , [{str, Body}]), {Row, Column + 5}, lists:append([{in_message_id, []}],Stack));
  36. scan("\n\n" ++ T, Scanned, {Row, _Column}, [{in_message_str, Body}|Stack]) ->
  37. scan(T, lists:append(Scanned , [{str, Body}]), {Row + 2, 1}, Stack);
  38. scan("\n", Scanned, {Row, _Column}, [{in_message_str, Body}|Stack]) ->
  39. scan([], lists:append(Scanned , [{str, Body}]), {Row + 2, 1}, Stack);
  40. %%Msg str
  41. scan("msgstr" ++ T, Scanned, {Row, Column}, [{in_message_id, Body} | Stack]) ->
  42. %%io:format("Id is ~s~n",[Body]),
  43. scan(T, lists:append(Scanned ,[{id, Body}]), {Row, Column + 6}, lists:append([{in_message_str, []}],Stack));
  44. %%Start and end for a message body
  45. scan("\"" ++ T , Scanned, {Row, Column}, [{in_string_body, Body}|Stack]) ->
  46. %%io:format("Ending string ~s ~p~n",[Body, Stack]),
  47. end_of_string(Body, Stack, T, Scanned, Row, Column);
  48. scan("\"" ++ T , Scanned, {Row, Column}, Stack) ->
  49. scan(T, Scanned, {Row, Column + 1}, lists:append([{in_string_body, []}], Stack));
  50. %%Carriage return are ignored
  51. scan([ "\n" | T] , Scanned, {Row, _Column}, Status) ->
  52. io:format("Carriage return ~p~n",[T]),
  53. scan(T, Scanned, {Row + 1, 1}, Status);
  54. %%Concat string body to already parsed
  55. scan([H | T] , Scanned, {Row, Column}, [{in_string_body, Body} | Stack]) ->
  56. scan(T, Scanned, {Row, Column + 1}, [{in_string_body, lists:append(Body, [H])} | Stack]);
  57. %%Others characters are ignored
  58. scan([_H | T] , Scanned, {Row, Column}, Status) ->
  59. scan(T, Scanned, {Row, Column + 1}, Status);
  60. %%EOF
  61. scan([], Scanned, {_Row, _Column}, _Stack) ->Scanned;
  62. scan(In, Scanned, {_Row, _Column}, _Status) ->
  63. io:format("Cannot process ~p, scanned ~p ~n",[In, Scanned]).
  64. end_of_string(String, [{in_message_id, Body}|Stack] ,T, Scanned, Row, Column) ->
  65. scan(T, Scanned, {Row, Column}, [{in_message_id, lists:append(Body ,String)} | Stack ]);
  66. end_of_string(String, [{in_message_str, Body}|Stack] , T, Scanned, Row, Column) ->
  67. scan(T, Scanned, {Row, Column }, [{in_message_str, lists:append(Body,String)} |Stack ]).
  68. %%
  69. %% Local Functions
  70. %%