Files
doitinpoland.com/wp-content/plugins/wpml-translation-management/classes/translation-jobs/class-wpml-tm-field-content-action.php
2023-09-12 21:41:04 +02:00

134 lines
4.1 KiB
PHP

<?php
use WPML\FP\Obj;
use \WPML\FP\Relation;
use WPML\FP\Lst;
use function WPML\FP\pipe;
class WPML_TM_Field_Content_Action extends WPML_TM_Job_Factory_User {
/** @var int $job_id */
protected $job_id;
/**
* WPML_TM_Field_Content_Action constructor.
*
* @param WPML_Translation_Job_Factory $job_factory
* @param int $job_id
*
* @throws \InvalidArgumentException
*/
public function __construct( $job_factory, $job_id ) {
parent::__construct( $job_factory );
if ( ! ( is_int( $job_id ) && $job_id > 0 ) ) {
throw new InvalidArgumentException( 'Invalid job id provided, received: ' . serialize( $job_id ) );
}
$this->job_id = $job_id;
}
/**
* Returns an array containing job fields
*
* @return array
* @throws \RuntimeException
*/
public function run() {
try {
$job = $this->job_factory->get_translation_job( $this->job_id, false, 1 );
if ( ! $job ) {
throw new RuntimeException( 'No job found for id: ' . $this->job_id );
}
return $this->content_from_elements( $job );
} catch ( Exception $e ) {
throw new RuntimeException(
'Could not retrieve field contents for job_id: ' . $this->job_id,
0,
$e
);
}
}
/**
* Extracts the to be retrieved content from given job elements
*
* @param stdClass $job
*
* @return array
*/
private function content_from_elements( $job ) {
/**
* @var array $elements
* @var array $previous_version_element
* @var stdClass $element
*/
$elements = $job->elements;
$previous_version_elements = isset( $job->prev_version ) ? $job->prev_version->elements : array();
$data = array();
foreach ( $elements as $index => $element ) {
$previous_element = $this->find_previous_version_element( $element, $previous_version_elements, $index );
$data[] = array(
'field_type' => sanitize_title( str_replace( WPML_TM_Field_Type_Encoding::CUSTOM_FIELD_KEY_SEPARATOR, '-', $element->field_type ) ),
'tid' => $element->tid,
'field_style' => $element->field_type === 'body' ? '2' : '0',
'field_finished' => $element->field_finished,
'field_data' => $this->sanitize_field_content( $element->field_data ),
'field_data_translated' => $this->sanitize_field_content( $element->field_data_translated ),
'diff' => $this->get_diff( $element, $previous_element ),
'field_wrap_tag' => $element->field_wrap_tag,
);
}
return $data;
}
private function find_previous_version_element( $element, $previous_version_elements, $index ) {
$findByMatchingFieldType = Lst::find( pipe( Obj::prop( 'field_type' ), Relation::equals( $element->field_type ) ) );
$findByIndex = Obj::prop( $index );
return $findByMatchingFieldType( $previous_version_elements ) ?: $findByIndex( $previous_version_elements );
}
private function has_diff( $element, $previous_element ) {
if ( null === $previous_element ) {
return false;
}
$current_data = $this->sanitize_field_content( $element->field_data );
$previous_data = $this->sanitize_field_content( $previous_element->field_data );
return $current_data !== $previous_data;
}
private function get_diff( $element, $previous_element ) {
if ( null === $previous_element || ! $this->has_diff( $element, $previous_element ) ) {
return null;
}
$current_data = $this->sanitize_field_content( $element->field_data );
$previous_data = $this->sanitize_field_content( $previous_element->field_data );
return wp_text_diff( $previous_data, $current_data, $element->field_format );
}
/**
* @param string $content base64-encoded translation job field content
*
* @return string base64-decoded field content, with linebreaks turned into
* paragraph html tags
*/
private function sanitize_field_content( $content ) {
$decoded = base64_decode( $content );
if ( ! $this->is_html( $decoded ) && false !== strpos( $decoded, '\n' ) ) {
$decoded = wpautop( $decoded );
}
return $decoded;
}
private function is_html( $string ) {
return $string !== strip_tags( $string );
}
}