From d4b3b0f9bc2c54075c9fad972a0db056dd5658f4 Mon Sep 17 00:00:00 2001 From: Deon George Date: Mon, 30 Jun 2014 14:22:57 +1000 Subject: [PATCH] Initial version --- .gitmodules | 6 + .htaccess | 28 ++ application/bootstrap.php | 170 +++++++++++ application/classes/Config.php | 113 ++++++++ application/classes/Controller/Translate.php | 218 ++++++++++++++ application/classes/Controller/Welcome.php | 10 + application/classes/Cookie.php | 15 + application/classes/Model/Language.php | 30 ++ application/classes/Model/Original.php | 28 ++ application/classes/Model/Translate.php | 30 ++ application/classes/ORM/OSB.php | 287 +++++++++++++++++++ application/config/database.php | 31 ++ application/views/pages/navbar.php | 0 application/views/theme/baseadmin/page.php | 130 +++++++++ application/views/translate.php | 33 +++ includes/kohana | 1 + index.php | 131 +++++++++ modules/lnApp | 1 + 18 files changed, 1262 insertions(+) create mode 100644 .gitmodules create mode 100644 .htaccess create mode 100644 application/bootstrap.php create mode 100644 application/classes/Config.php create mode 100644 application/classes/Controller/Translate.php create mode 100644 application/classes/Controller/Welcome.php create mode 100644 application/classes/Cookie.php create mode 100644 application/classes/Model/Language.php create mode 100644 application/classes/Model/Original.php create mode 100644 application/classes/Model/Translate.php create mode 100644 application/classes/ORM/OSB.php create mode 100644 application/config/database.php create mode 100644 application/views/pages/navbar.php create mode 100644 application/views/theme/baseadmin/page.php create mode 100644 application/views/translate.php create mode 160000 includes/kohana create mode 100644 index.php create mode 160000 modules/lnApp diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f37ce1e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "includes/kohana"] + path = includes/kohana + url = ssh://deon@l.dlcm.co:222/afs/local/git/lnkohana +[submodule "modules/lnApp"] + path = modules/lnApp + url = ssh://deon@l.dlcm.co:222/afs/local/git/lnapp diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..aa2b575 --- /dev/null +++ b/.htaccess @@ -0,0 +1,28 @@ +# Turn on URL rewriting +RewriteEngine On + +# Installation directory +RewriteBase /aer + +# Protect hidden files from being viewed + + Order Deny,Allow + Deny From All + + +# Protect application and system files from being viewed +RewriteRule ^(?:application|modules|system)\b.* index.php/$0 [L] + +# Allow any files or directories that exist to be displayed directly +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d + +# Rewrite all other URLs to index.php/URL +RewriteRule .* index.php/$0 [PT] + +AuthType Basic +AuthName "Restricted !" +# (Following line optional) +AuthBasicProvider file +AuthUserFile /local/WEB/sites/net.leenooks.dev/aer/.htuser +Require valid-user diff --git a/application/bootstrap.php b/application/bootstrap.php new file mode 100644 index 0000000..1874298 --- /dev/null +++ b/application/bootstrap.php @@ -0,0 +1,170 @@ +" + */ +if (isset($_SERVER['KOHANA_ENV'])) +{ + Kohana::$environment = constant('Kohana::'.strtoupper($_SERVER['KOHANA_ENV'])); +} + +/** + * Initialize Kohana, setting the default options. + * + * The following options are available: + * + * - string base_url path, and optionally domain, of your application NULL + * - string index_file name of your index file, usually "index.php" index.php + * - string charset internal character set used for input and output utf-8 + * - string cache_dir set the internal cache directory APPPATH/cache + * - integer cache_life lifetime, in seconds, of items cached 60 + * - boolean errors enable or disable error handling TRUE + * - boolean profile enable or disable internal profiling TRUE + * - boolean caching enable or disable internal caching FALSE + * - boolean expose set the X-Powered-By header FALSE + */ +Kohana::init(array( + 'base_url' => '/aer', + 'caching' => TRUE, + 'index_file' => '', +)); + +/** + * Attach the file write to logging. Multiple writers are supported. + */ +Kohana::$log->attach(new Log_File(APPPATH.'logs')); + +/** + * Attach a file reader to config. Multiple readers are supported. + */ +Kohana::$config->attach(new Config_File); + +/** + * Enable modules. Modules are referenced by a relative or absolute path. + */ +Kohana::modules(array( + 'lnapp' => MODPATH.'lnApp', // lnApp Base Application Tools + // 'oauth' => MODPATH.'oauth', // OAuth Module for External Authentication + 'auth' => SMDPATH.'auth', // Basic authentication + 'cache' => SMDPATH.'cache', // Caching with multiple backends + // 'cron' => SMDPATH.'cron', // Kohana Cron Module + // 'codebench' => SMDPATH.'codebench', // Benchmarking tool + 'database' => SMDPATH.'database', // Database access + // 'gchart' => MODPATH.'gchart', // Google Chart Module + // 'highchart' => MODPATH.'highchart', // Highcharts Chart Module + // 'image' => SMDPATH.'image', // Image manipulation + // 'khemail' => SMDPATH.'khemail', // Email module for Kohana 3 PHP Framework + // 'minion' => SMDPATH.'minion', // CLI Tasks + 'orm' => SMDPATH.'orm', // Object Relationship Mapping + 'pagination' => SMDPATH.'pagination', // Kohana Pagination module for Kohana 3 PHP Framework + // 'unittest' => SMDPATH.'unittest', // Unit testing + // 'userguide' => SMDPATH.'userguide', // User guide and API documentation + 'xml' => SMDPATH.'xml', // XML module for Kohana 3 PHP Framework + )); + +/** + * Enable specalised interfaces + */ +Route::set('sections', '/(/(/(/)))', + array( + 'directory' => '('.implode('|',array_values(URL::$method_directory)).')' + )) + ->defaults(array( + 'action' => 'index', + )); + +// Static file serving (CSS, JS, images) +Route::set('default/media', 'media(/)', array('file' => '.+')) + ->defaults(array( + 'controller' => 'media', + 'action' => 'get', + )); + +/** + * Set the routes. Each route must have a minimum of a name, a URI and a set of + * defaults for the URI. + */ +Route::set('default', '((/(/)))', array('id'=>'[a-zA-Z0-9_.-]+')) + ->defaults(array( + 'controller' => 'welcome', + 'action' => 'index', + )); + +/** + * If APC is enabled, and we need to clear the cache + */ +if (file_exists(APPPATH.'cache/CLEAR_APC_CACHE') AND function_exists('apc_clear_cache') AND (PHP_SAPI !== 'cli')) { + if (! apc_clear_cache() OR ! unlink(APPPATH.'cache/CLEAR_APC_CACHE')) + throw new Kohana_Exception('Unable to clear the APC cache.'); +} + +// If we are a CLI, set our session dir +if (PHP_SAPI === 'cli') + session_save_path('tmp/'); +?> diff --git a/application/classes/Config.php b/application/classes/Config.php new file mode 100644 index 0000000..abab2cb --- /dev/null +++ b/application/classes/Config.php @@ -0,0 +1,113 @@ +load('config')->cache_type) ? 'file' : Kohana::$config->load('config')->cache_type; + } + + public static function copywrite() { + return '(c) 2014 Deon George'; + } + + public static function country() { + return NULL; + } + + /** + * Show a date using a site configured format + */ + public static function date($date) { + return (is_null($date) OR ! $date) ? '' : date('d-M-Y',$date); + } + + public static function language() { + // @todo To implement + return 'auto'; + } + + /** + * The URI to show for the login prompt. + * Normally if the user is logged in, we can replace it with something else + */ + public static function login_uri() { + return ($ao = Auth::instance()->get_user() AND is_object($ao)) ? $ao->name() : HTML::anchor('login',_('Login')); + } + + public static function logo() { + return HTML::image(static::logo_uri(),array('class'=>'headlogo','alt'=>_('Logo'))); + } + + public static function logo_uri($protocol=NULL) { + list ($path,$suffix) = explode('.',static::$logo); + + return URL::site(Route::get('default/media')->uri(array('file'=>$path.'.'.$suffix),array('alt'=>static::sitename())),$protocol); + } + + public static function siteid($format=FALSE) { + return ''; + } + + /** + * Work out our site mode (dev,test,prod) + */ + public static function sitemode() { + return Kohana::$config->load('config.site')->mode; + } + + public static function sitename() { + return 'AER Translate'; + } + + public static function theme() { + return 'theme/'.Kohana::$config->load('config')->theme; + } + + public static function version() { + // @todo Work out our versioning + return 'TBA'; + } +} +?> diff --git a/application/classes/Controller/Translate.php b/application/classes/Controller/Translate.php new file mode 100644 index 0000000..34c6be3 --- /dev/null +++ b/application/classes/Controller/Translate.php @@ -0,0 +1,218 @@ +/','',$data); + + return $data; + } + + public function action_index() { + HTTP::redirect(URL::link('','translate/render')); + $output = ''; + + Block::factory() + ->title('Hello') + ->title_icon('icon-cog') + ->body($output); + } + + public function action_import() { + $html = new simple_html_dom(); + $html->load($this->aer()); + + $this->store($html->find('head',0)->find('title',0)); + + foreach ($this->_tags as $z) + foreach ($html->find($z) as $x) + $this->store($x); + + HTTP::redirect(URL::link('','translate/index')); + } + + public function action_render() { + $output = ''; + + if ($this->request->post('language_id')) { + $html = new simple_html_dom(); + $html->load($this->aer()); + + $x = $html->find('head',0); + $x->innertext .= ''; + $lo = ORM::factory('Language',$this->request->post('language_id')); + + foreach ($this->_tags as $z) + foreach ($html->find($z) as $x) + $x->innertext = $this->translate($x,$lo); + + // Convert order the img tags + foreach ($html->find('img') as $z) { + $z->src = sprintf('%s/%s',URL::site('media/aer'),$z->src); + } + + $this->response->body($html); + $this->auto_render = FALSE; + + // We dont know what sort of payment type yet + } else { + $x = $this->lang(); + $output .= Form::open(); + $output .= Form::select('language_id',ORM::factory('Language')->list_select(),$x->id); + $output .= Form::button('submit','Submit',array('class'=>'btn btn-primary')); + $output .= Form::close(); + } + + Block::factory() + ->title('Render in...') + ->title_icon('icon-share') + ->body($output); + } + + public function action_save() { + foreach ($this->request->post('x') as $id => $value) { + if (! $value) + continue; + + $to = ORM::factory('Translate',array('language_id'=>$this->request->post('language_id'),'original_id'=>$id)); + + $to->translation = $value; + $to->language_id = $this->request->post('language_id'); + $to->original_id = $id; + $to->save(); + } + + HTTP::redirect(sprintf('%s?language_id=%s&page=%s',URL::link('','translate/text'),$this->request->post('language_id'),$this->request->post('page'))); + } + + private function lang() { + foreach ($this->request->accept_lang() as $k=>$v) { + if (strlen($k) == 2) + $k = sprintf('%s_%s',strtolower($k),strtoupper($k)); + else { + list($k,$v) = preg_split('/[-_]/',$k,2); + $k = sprintf('%s_%s',strtolower($k),strtoupper($v)); + } + + if ($x=ORM::factory('Language',array('iso'=>$k))) + return $x; + } + } + + private function store(simple_html_dom_node $x,$l=0) { + if ($x->children()) { + foreach ($x->children() as $y) { + $this->store($y,$l+1); + $y->innertext = '%s'; + } + } + + // If we have a numeric value, convert it to %d + $x->innertext = preg_replace('/[0-9.]+/','%d',$x->innertext); + + $oo = ORM::factory('Original',array('sentence'=>$x->innertext)); + + if (! trim($x->innertext) or (in_array(trim($x->innertext),array('$',' ')) or preg_match('/%d%?$/',$x->innertext))) { + return $x->innertext; + + } elseif (! $oo->loaded()) { + $oo->sentence = $x->innertext; + $oo->save(); + } + + return $x->innertext; + } + + private function translate(simple_html_dom_node $x,Model_Language $lo,$l=0) { + $nums = NULL; + $matches = array(); + $dom_tmp = str_get_html($x->outertext); + $dom_tmp_node = $dom_tmp->firstChild(); + + $string = $this->store($dom_tmp_node,$l); + $oo = ORM::factory('Original',array('sentence'=>$string)); + + // If we have numbers, we'll need to save them. + if (preg_match('/%d/',$string)) + $nums = preg_match('/[0-9.]+/',$x->innertext,$matches); + + if ($oo->loaded()) { + $to = ORM::factory('Translate',array('original_id'=>$oo->id,'language_id'=>$lo->id)); + + $string = $to->loaded() ? $to->translation : $x->innertext; + } + + if ($nums && $nums == 1) + $string = str_replace('%d',$matches[0],$string); + elseif ($nums > 1) + throw HTTP_Exception::factory('501','Argh, didnt allow for more than 1 match'); + + + if ($x->children()) { + foreach ($x->children() as $y) { + $string = preg_replace('/%s/',$this->translate($y,$lo,$l+1),$string); + } + } + + return $string; + } + + public function action_text() { + $output = ''; + + if ($this->request->query('language_id')) { + + $output .= Form::open(URL::link('','translate/save')); + $output .= Form::hidden('language_id',$this->request->query('language_id')); + + $oo = ORM::factory('Original') + ->select('translate.translation') + ->join('translate','LEFT OUTER') + ->on('original.id','=','translate.original_id') + ->on('translate.language_id','=',$this->request->query('language_id')); + + $output .= View::factory('translate') + ->set('o',$oo->find_all()); + + // We dont know what sort of payment type yet + } else { + $x = $this->lang(); + $output .= Form::open(NULL,array('method'=>'GET')); + $output .= Form::select('language_id',ORM::factory('Language')->list_select(),$x->id); + } + + $output .= Form::button('submit','Submit',array('class'=>'btn btn-primary')); + $output .= Form::close(); + + Block::factory() + ->title('Translate Text') + ->title_icon('icon-share') + ->body($output); + } + +} // End Welcome diff --git a/application/classes/Controller/Welcome.php b/application/classes/Controller/Welcome.php new file mode 100644 index 0000000..6134f85 --- /dev/null +++ b/application/classes/Controller/Welcome.php @@ -0,0 +1,10 @@ + diff --git a/application/classes/Model/Language.php b/application/classes/Model/Language.php new file mode 100644 index 0000000..7897a60 --- /dev/null +++ b/application/classes/Model/Language.php @@ -0,0 +1,30 @@ +'id','value'=>'name'); + + /** + * Filters used to format the display of values into friendlier values + */ + protected $_display_filters = array( + 'date_orig'=>array( + array('Config::datetime',array(':value')), + ), + ); +} +?> diff --git a/application/classes/Model/Original.php b/application/classes/Model/Original.php new file mode 100644 index 0000000..16f601b --- /dev/null +++ b/application/classes/Model/Original.php @@ -0,0 +1,28 @@ +array( + array('Config::datetime',array(':value')), + ), + ); +} +?> diff --git a/application/classes/Model/Translate.php b/application/classes/Model/Translate.php new file mode 100644 index 0000000..0c9d602 --- /dev/null +++ b/application/classes/Model/Translate.php @@ -0,0 +1,30 @@ +'id','value'=>'translation'); + + /** + * Filters used to format the display of values into friendlier values + */ + protected $_display_filters = array( + 'date_orig'=>array( + array('Config::datetime',array(':value')), + ), + ); +} +?> diff --git a/application/classes/ORM/OSB.php b/application/classes/ORM/OSB.php new file mode 100644 index 0000000..1ca09b8 --- /dev/null +++ b/application/classes/ORM/OSB.php @@ -0,0 +1,287 @@ +'date_orig','format'=>TRUE); + protected $_updated_column = array('column'=>'date_last','format'=>TRUE); + + // Our attributes used in forms. + protected $_form = array(); + + // Our attributes that should be converted to NULL when empty + protected $_nullifempty = array(); + + // Our attribute values that need to be stored as serialized + protected $_serialize_column = array(); + + // If we need to load any sub items on loading this model + protected $_sub_items = array(); + protected $_sub_items_load = array(); + protected $_sub_items_sorted = FALSE; + + // Rules to assist with site ID and getting next record ID for inserts. + public function xrules() { + return array( + 'id'=>array( + array('ORM_OSB::get_next_id',array(':model',':field')), + ), + 'site_id'=>array( + array('ORM_OSB::set_site_id',array(':model',':field')), + ), + ); + } + + /** + * Retrieve and Store DB BLOB data. + */ + private function _blob($data,$set=FALSE) { + try { + return $set ? gzcompress($this->_serialize($data,$set)) : $this->_serialize(gzuncompress($data)); + + // Maybe the data isnt compressed? + } catch (Exception $e) { + return $this->_serialize($data,$set); + } + } + + /** + * Auto process some data as it comes from the database + * @see parent::__get() + */ + public function __get($column) { + if (array_key_exists($column,$this->_table_columns)) { + // If the column is a blob, we'll decode it automatically + if ( + $this->_table_columns[$column]['data_type'] == 'blob' + AND ! is_null($this->_object[$column]) + AND ! isset($this->_changed[$column]) + AND (! isset($this->_table_columns[$column]['auto_convert']) OR ! $this->_table_columns[$column]['auto_convert']) + ) { + + // In case our blob hasnt been saved as one. + try { + $this->_object[$column] = $this->_blob($this->_object[$column]); + } + catch(Exception $e) { + HTTP_Exception::factory(501,Kohana_Exception::text($e)); + } + + $this->_table_columns[$column]['auto_convert'] = TRUE; + } + + // If the column is a serialized object, we'll unserialize it. + if ( + in_array($column,$this->_serialize_column) + AND is_string($this->_object[$column]) + AND ! is_null($this->_object[$column]) + AND ! isset($this->_changed[$column]) + AND (! isset($this->_table_columns[$column]['unserialized']) OR ! $this->_table_columns[$column]['unserialized']) + ) { + + // In case our object hasnt been saved as serialized. + try { + $this->_object[$column] = unserialize($this->_object[$column]); + } + catch(Exception $e) { + HTTP_Exception::factory(501,Kohana_Exception::text($e)); + } + + $this->_table_columns[$column]['unserialized'] = TRUE; + } + } + + return parent::__get($column); + } + + /** + * Intercept our object load, so that we can load our subitems + */ + protected function _load_values(array $values) { + parent::_load_values($values); + + $sort = FALSE; + if ($this->_loaded AND $this->_sub_items_load AND count($this->_sub_items_load) == 1) + foreach ($this->_sub_items_load as $item => $sort) + $this->_sub_items = $this->$item->find_all()->as_array(); + + if ($sort) { + Sort::MAsort($this->_sub_items,$sort); + $this->_sub_items_sorted = TRUE; + } + + return $this; + } + + /** + * If a column is marked to be nullified if it is empty, this is where it is done. + */ + private function _nullifempty(array $array) { + foreach ($array as $k=>$v) { + if (is_array($v)) { + if (is_null($x=$this->_nullifempty($v))) + unset($array[$k]); + else + $array[$k] = $x; + + } elseif (! $v AND $v !== 0 AND $v !== '0') + unset($array[$k]); + + } + + return count($array) ? $array : NULL; + } + + /** + * Try and (un)serialize our data, and if it fails, just return it. + */ + private function _serialize($data,$set=FALSE) { + try { + return $set ? serialize($data) : unserialize($data); + + // Maybe the data serialized? + } catch (Exception $e) { + return $data; + } + } + + public function config($key) { + $mc = Config::instance()->module_config($this->_object_name); + + return empty($mc[$key]) ? '' : $mc[$key]; + } + + public function dump() { + $result = array(); + + $result['this'] = $this->object(); + + foreach ($this->_sub_items as $o) + $result['sub'][] = $o->dump(); + + return $result; + } + + /** + * Get Next record id + * + * @param array Validate object + * @param string Primary Key + */ + final public static function get_next_id($model,$field) { + if (! is_null($model->$field)) + return TRUE; + + $model->_changed[$field] = $field; + + $ido = ORM::factory('Module') + ->where('name','=',$model->_table_name) + ->find(); + + if (! $ido->loaded()) + throw new Kohana_Exception('Problem getting record_id for :table',array(':table'=>$model->_table_name)); + + $model->$field = $ido->record_id->next_id($ido->id); + + return TRUE; + } + + public function keyget($column,$key=NULL) { + if (is_null($key) OR ! is_array($this->$column)) + return $this->$column; + else + return array_key_exists($key,$this->$column) ? $this->{$column}[$key] : NULL; + } + + final public function mid() { + return ORM::factory('Module',array('name'=>$this->_table_name)); + } + + public function xsave(Validation $validation=NULL) { + // Find any fields that have changed, and process them. + if ($this->_changed) + foreach ($this->_changed as $c) { + // Any fields that are blobs, and encode them. + if (! is_null($this->_object[$c]) AND $this->_table_columns[$c]['data_type'] == 'blob') { + $this->_object[$c] = $this->_blob($this->_object[$c],TRUE); + + // We need to reset our auto_convert flag + if (isset($this->_table_columns[$c]['auto_convert'])) + $this->_table_columns[$c]['auto_convert'] = FALSE; + + // Any fields that should be seriailzed, we'll do that. + } elseif (is_array($this->_object[$c]) AND in_array($c,$this->_serialize_column)) { + $this->_object[$c] = serialize($this->_object[$c]); + } + + // Test if the value has still changed + if ($this->_original_values AND $this->_object[$c] == $this->_original_values[$c]) + unset($this->_changed[$c]); + } + + return parent::save($validation); + } + + /** + * Set the site ID attribute for each row update + */ + final public static function set_site_id($model,$field) { + if (! is_null($model->$field)) + return TRUE; + + $model->_changed[$field] = $field; + $model->$field = Company::instance()->site(); + + return TRUE; + } + + public function subitems() { + return $this->_sub_items; + } + + /** + * Override the Kohana processing so we can null values if required. + */ + public function values(array $values,array $expected=NULL) { + foreach ($values as $k=>$v) { + // Convert to NULL + if (in_array($k,$this->_nullifempty)) { + if (is_array($v)) + $values[$k] = $this->_nullifempty($v); + + elseif (! $v AND $v !== 0 AND $v !== '0') + $values[$k] = NULL; + } + } + + return parent::values($values,$expected); + } + + /** + * Function help to find records that are active + */ + public function list_active($active=TRUE) { + $x=($active ? $this->_where_active() : $this); + + return $x->find_all(); + } + + public function list_count($active=TRUE) { + $x=($active ? $this->_where_active() : $this); + + return $x->find_all()->count(); + } +} +?> diff --git a/application/config/database.php b/application/config/database.php new file mode 100644 index 0000000..db4753c --- /dev/null +++ b/application/config/database.php @@ -0,0 +1,31 @@ + array + ( + 'type' => 'MySQL', + 'connection' => array( + /** + * The following options are available for MySQL: + * + * string hostname server hostname, or socket + * string database database name + * string username database username + * string password database password + * boolean persistent use persistent connections? + * array variables system variables as "key => value" pairs + * + * Ports and sockets may be appended to the hostname. + */ + 'hostname' => 'localhost', + 'database' => 'weblnaer', + 'username' => 'aer', + 'password' => 'AeR', + 'persistent' => TRUE, + ), + 'table_prefix' => '', + 'charset' => 'utf8', + 'caching' => FALSE, + ), +); diff --git a/application/views/pages/navbar.php b/application/views/pages/navbar.php new file mode 100644 index 0000000..e69de29 diff --git a/application/views/theme/baseadmin/page.php b/application/views/theme/baseadmin/page.php new file mode 100644 index 0000000..4dee9aa --- /dev/null +++ b/application/views/theme/baseadmin/page.php @@ -0,0 +1,130 @@ + + + + <?php echo $meta->title; ?> + + + + + + + + + + + + = Kohana::TESTING OR Request::current()->secure()) { + echo HTML::style('media/theme/bootstrap/css/bootstrap.min.css'); + echo HTML::style('media/theme/bootstrap/css/bootstrap-responsive.min.css'); + echo HTML::style('media/vendor/font-awesome/css/font-awesome.min.css'); + } else { + echo HTML::style($meta->secure().'netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap.min.css'); + echo HTML::style($meta->secure().'netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-responsive.min.css'); + echo HTML::style($meta->secure().'netdna.bootstrapcdn.com/font-awesome/3.0.2/css/font-awesome.css'); + } + + echo HTML::style($meta->secure().'fonts.googleapis.com/css?family=Open+Sans:400italic,600italic,800italic,400,600,800'); + echo HTML::style('media/css/ui-lightness/jquery-ui-1.10.0.custom.min.css'); + echo HTML::style('media/theme/baseadmin/css/base-admin-2.css'); + echo HTML::style('media/theme/baseadmin/css/base-admin-2-responsive.css'); + echo HTML::style('media/theme/baseadmin/css/custom.css'); + echo Style::factory()->render_all(); + ?> + + + + + + + + + +
+
+
+
+ render_all(); ?> +
+
+
+
+ +
+
+
+ +
+
+
+ + = Kohana::TESTING OR Request::current()->secure()) { + echo HTML::script('media/js/jquery/jquery-1.9.1.min.js'); + echo HTML::script('media/theme/bootstrap/js/bootstrap.min.js'); + echo HTML::script('media/js/lodash/lodash-1.2.1.min.js'); + } else { + echo HTML::script($meta->secure().'code.jquery.com/jquery-1.9.1.min.js'); + echo HTML::script($meta->secure().'netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/js/bootstrap.min.js'); + echo HTML::script($meta->secure().'cdnjs.cloudflare.com/ajax/libs/lodash.js/1.2.1/lodash.min.js'); + } + + echo HTML::script('media/theme/baseadmin/js/backtotop.js'); + echo HTML::script('media/js/search.js'); + echo HTML::script('media/js/custom.js'); + echo Script::factory()->render_all(); + ?> + + diff --git a/application/views/translate.php b/application/views/translate.php new file mode 100644 index 0000000..433ff1f --- /dev/null +++ b/application/views/translate.php @@ -0,0 +1,33 @@ +$o->count(),'items_per_page'=>10)); ?> + + +current_page()); ?> + + + + + + + + + current_first_item()) + continue; + elseif ($i > $pag->current_last_item()) + break; + ?> + + sentence) OR preg_match('/>/',$oo->sentence)) : + $oo->sentence = preg_replace('/sentence); + $oo->sentence = preg_replace('/>/','>',$oo->sentence); + endwhile + ?> + + + + + + + + +
TextTranslationIgnore
sentence; ?>id),$oo->translation,array('style'=>'width: 100%;')); ?>
diff --git a/includes/kohana b/includes/kohana new file mode 160000 index 0000000..e2475db --- /dev/null +++ b/includes/kohana @@ -0,0 +1 @@ +Subproject commit e2475dba9e6eaeafc6ecc4c71542937638354cd4 diff --git a/index.php b/index.php new file mode 100644 index 0000000..c7bb26f --- /dev/null +++ b/index.php @@ -0,0 +1,131 @@ += 5.3, it is recommended to disable + * deprecated notices. Disable with: E_ALL & ~E_DEPRECATED + */ +error_reporting(E_ALL | E_STRICT); + +/** + * End of standard configuration! Changing any of the code below should only be + * attempted by those with a working knowledge of Kohana internals. + * + * @link http://kohanaframework.org/guide/using.configuration + */ + +// Set the full path to the docroot +define('DOCROOT', realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR); + +// Make the application relative to the docroot, for symlink'd index.php +if ( ! is_dir($application) AND is_dir(DOCROOT.$application)) + $application = DOCROOT.$application; + +// Make the modules relative to the docroot, for symlink'd index.php +if ( ! is_dir($modules) AND is_dir(DOCROOT.$modules)) + $modules = DOCROOT.$modules; + +// Make the system relative to the docroot, for symlink'd index.php +if ( ! is_dir($sysmodules) AND is_dir(DOCROOT.$sysmodules)) + $sysmodules = DOCROOT.$sysmodules; + +// Make the system relative to the docroot, for symlink'd index.php +if ( ! is_dir($system) AND is_dir(DOCROOT.$system)) + $system = DOCROOT.$system; + +// Define the absolute paths for configured directories +define('APPPATH', realpath($application).DIRECTORY_SEPARATOR); +define('MODPATH', realpath($modules).DIRECTORY_SEPARATOR); +define('SMDPATH', realpath($sysmodules).DIRECTORY_SEPARATOR); +define('SYSPATH', realpath($system).DIRECTORY_SEPARATOR); + +// Clean up the configuration vars +unset($application, $modules, $sysmodules, $system); + +if (file_exists('install'.EXT)) +{ + // Load the installation check + return include 'install'.EXT; +} + +/** + * Define the start time of the application, used for profiling. + */ +if ( ! defined('KOHANA_START_TIME')) +{ + define('KOHANA_START_TIME', microtime(TRUE)); +} + +/** + * Define the memory usage at the start of the application, used for profiling. + */ +if ( ! defined('KOHANA_START_MEMORY')) +{ + define('KOHANA_START_MEMORY', memory_get_usage()); +} + +// Bootstrap the application +require APPPATH.'bootstrap'.EXT; + +if (PHP_SAPI == 'cli') // Try and load minion +{ + class_exists('Minion_Task') OR die('Please enable the Minion module for CLI support.'); + set_exception_handler(array('Minion_Exception', 'handler')); + + Minion_Task::factory(Minion_CLI::options())->execute(); +} +else +{ + /** + * Execute the main request. A source of the URI can be passed, eg: $_SERVER['PATH_INFO']. + * If no source is specified, the URI will be automatically detected. + */ + echo Request::factory(TRUE, array(), FALSE) + ->execute() + ->send_headers(TRUE) + ->body(); +} diff --git a/modules/lnApp b/modules/lnApp new file mode 160000 index 0000000..a889d25 --- /dev/null +++ b/modules/lnApp @@ -0,0 +1 @@ +Subproject commit a889d25eda0d6c1b8766b15f2d71f3dd4f0357d9