tmgmt_file.format.html.inc 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <?php
  2. /**
  3. * Export into HTML.
  4. */
  5. class TMGMTFileFormatHTML implements TMGMTFileFormatInterface {
  6. /**
  7. * Returns base64 encoded data that is safe for use in xml ids.
  8. */
  9. protected function encodeIdSafeBase64($data) {
  10. // Prefix with a b to enforce that the first character is a letter.
  11. return 'b' . rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
  12. }
  13. /**
  14. * Returns decoded id safe base64 data.
  15. */
  16. protected function decodeIdSafeBase64($data) {
  17. // Remove prefixed b.
  18. $data = substr($data, 1);
  19. return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
  20. }
  21. /**
  22. * {@inheritdoc}
  23. */
  24. public function export(TMGMTJob $job, $conditions = array()) {
  25. $items = array();
  26. foreach ($job->getItems($conditions) as $item) {
  27. $data = array_filter(tmgmt_flatten_data($item->getData()), '_tmgmt_filter_data');
  28. foreach ($data as $key => $value) {
  29. $items[$item->tjiid][$this->encodeIdSafeBase64($item->tjiid . '][' . $key)] = $value;
  30. }
  31. }
  32. return theme('tmgmt_file_html_template', array(
  33. 'tjid' => $job->tjid,
  34. 'source_language' => $job->getTranslator()->mapToRemoteLanguage($job->source_language),
  35. 'target_language' => $job->getTranslator()->mapToRemoteLanguage($job->target_language),
  36. 'items' => $items,
  37. ));
  38. }
  39. /**
  40. * {@inheritdoc}
  41. */
  42. public function import($imported_file, $is_file = TRUE) {
  43. $dom = new DOMDocument();
  44. $dom->loadHTMLFile($imported_file);
  45. $xml = simplexml_import_dom($dom);
  46. $data = array();
  47. foreach ($xml->xpath("//div[@class='atom']") as $atom) {
  48. // Assets are our strings (eq fields in nodes).
  49. $key = $this->decodeIdSafeBase64((string) $atom['id']);
  50. $data[$key]['#text'] = (string) $atom;
  51. }
  52. return tmgmt_unflatten_data($data);
  53. }
  54. /**
  55. * {@inheritdoc}
  56. */
  57. public function validateImport($imported_file) {
  58. $dom = new DOMDocument();
  59. if (!$dom->loadHTMLFile($imported_file)) {
  60. return FALSE;
  61. }
  62. $xml = simplexml_import_dom($dom);
  63. // Collect meta information.
  64. $meta_tags = $xml->xpath('//meta');
  65. $meta = array();
  66. foreach ($meta_tags as $meta_tag) {
  67. $meta[(string) $meta_tag['name']] = (string) $meta_tag['content'];
  68. }
  69. // Check required meta tags.
  70. foreach (array('JobID', 'languageSource', 'languageTarget') as $name) {
  71. if (!isset($meta[$name])) {
  72. return FALSE;
  73. }
  74. }
  75. // Attempt to load the job.
  76. if (!$job = tmgmt_job_load($meta['JobID'])) {
  77. drupal_set_message(t('The imported file job id @file_tjid is not available.', array(
  78. '@file_tjid' => $job->tjid,
  79. )), 'error');
  80. return FALSE;
  81. }
  82. // Check language.
  83. if ($meta['languageSource'] != $job->getTranslator()->mapToRemoteLanguage($job->source_language) ||
  84. $meta['languageTarget'] != $job->getTranslator()->mapToRemoteLanguage($job->target_language)) {
  85. return FALSE;
  86. }
  87. // Validation successful.
  88. return $job;
  89. }
  90. }