cc.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. <?php
  2. App::import('Core', 'Folder');
  3. App::import('Core', 'File');
  4. if (!defined('LF')) {
  5. define('LF', "\r\n"); # windows compatible as default
  6. }
  7. /**
  8. * Code Completion
  9. * 2009-12-26 ms
  10. */
  11. class CcShell extends Shell {
  12. var $uses = array();
  13. protected $plugins = null;
  14. protected $content = '';
  15. function main() {
  16. $this->out('Code Completion Dump - customized for PHPDesigner');
  17. //TODO: ask for version (1.2 etc - defaults to 1.3!)
  18. $this->filename = APP.'code_completion__.php';
  19. # get classes
  20. $this->models();
  21. $this->behaviors();
  22. $this->components();
  23. $this->helpers();
  24. //TODO: behaviors
  25. # write to file
  26. $this->_dump();
  27. $this->out('...done');
  28. }
  29. /**
  30. * @deprecated
  31. * now use: Configure::listObjects()
  32. */
  33. function __getFiles($folder) {
  34. $handle = new Folder($folder);
  35. $handleFiles = $handle->read(true, true);
  36. $files = $handleFiles[1];
  37. foreach ($files as $key => $file) {
  38. $file = extractPathInfo('file', $file);
  39. if (mb_strrpos($file, '_') === mb_strlen($file) - 1) { # ending with _ like test_.php
  40. unset($files[$key]);
  41. } else {
  42. $files[$key] = Inflector::camelize($file);
  43. }
  44. }
  45. return $files;
  46. }
  47. public function _getFiles($type) {
  48. $files = App::objects($type, null, false);
  49. //$paths = (array)App::path($type.'s');
  50. //$libFiles = App::objects($type, $paths[0] . 'lib' . DS, false);
  51. if (!isset($this->plugins)) {
  52. $this->plugins = App::objects('plugin');
  53. }
  54. if (!empty($this->plugins)) {
  55. foreach ($this->plugins as $plugin) {
  56. $path = App::pluginPath($plugin);
  57. if ($type == 'helper') {
  58. $path .= 'views' . DS;
  59. } elseif ($type == 'components') {
  60. $path .= 'controllers' . DS;
  61. } elseif ($type == 'behavior') {
  62. $path .= 'models' . DS;
  63. } elseif ($type == 'datasources') {
  64. $path .= 'models' . DS;
  65. }
  66. $path .= $type.'s' . DS;
  67. $pluginFiles = App::objects($type, $path, false);
  68. if (!empty($pluginFiles)) {
  69. foreach ($pluginFiles as $t) {
  70. $files[] = $t;
  71. }
  72. }
  73. }
  74. }
  75. $files = array_unique($files);
  76. $appIndex = array_search('App', $files);
  77. if ($appIndex !== false) {
  78. unset($files[$appIndex]);
  79. }
  80. # no test/tmp files etc (helper.test.php or helper.OLD.php)
  81. foreach ($files as $key => $file) {
  82. if (strpos($file, '.') !== false || !preg_match('/^[\da-zA-Z_]+$/', $file)) {
  83. unset($files[$key]);
  84. }
  85. }
  86. return $files;
  87. }
  88. function models() {
  89. $files = $this->_getFiles('model');
  90. $content = LF.'<?php'.LF;
  91. $content .= '/*** model start ***/'.LF;
  92. $content .= 'class AppModel extends Model {'.LF;
  93. if (!empty($files)) {
  94. $content .= $this->_prepModels($files);
  95. }
  96. $content .= '}'.LF;
  97. $content .= '/*** model end ***/'.LF;
  98. $content .= '?>';
  99. $this->content .= $content;
  100. }
  101. function behaviors() {
  102. $files = $this->_getFiles('behavior');
  103. $content = LF.'<?php'.LF;
  104. $content .= '/*** behavior start ***/'.LF;
  105. $content .= 'class AppModel extends Model {'.LF;
  106. if (!empty($files)) {
  107. $content .= $this->_prepBehaviors($files);
  108. }
  109. $content .= '}'.LF;
  110. $content .= '/*** behavior end ***/'.LF;
  111. $content .= '?>';
  112. $content .= '/*** model start ***/'.LF;
  113. $this->content .= $content;
  114. }
  115. function components() {
  116. $files = $this->_getFiles('component');
  117. $content = LF.'<?php'.LF;
  118. $content .= '/*** component start ***/'.LF;
  119. $content .= 'class AppController extends Controller {'.LF;
  120. if (!empty($files)) {
  121. $content .= $this->_prepComponents($files);
  122. }
  123. $content .= '}'.LF;
  124. $content .= '/*** component end ***/'.LF;
  125. $content .= '?>';
  126. $this->content .= $content;
  127. }
  128. function helpers() {
  129. $files = $this->_getFiles('helper');
  130. $content = LF.'<?php'.LF;
  131. $content .= '/*** helper start ***/'.LF;
  132. $content .= 'class AppHelper extends Helper {'.LF;
  133. if (!empty($files)) {
  134. $content .= $this->_prepHelpers($files);
  135. }
  136. $content .= '}'.LF;
  137. $content .= '/*** helper end ***/'.LF;
  138. $content .= '?>';
  139. $this->content .= $content;
  140. }
  141. function _prepModels($files) {
  142. $res = '';
  143. foreach ($files as $name) {
  144. $res .= '
  145. /**
  146. * '.$name.'
  147. *
  148. * @var '.$name.'
  149. */
  150. public $'.$name.';
  151. '.LF;
  152. }
  153. $res .= ' function __construct() {';
  154. foreach ($files as $name) {
  155. $res .= '
  156. $this->'.$name.' = new '.$name.'();';
  157. }
  158. $res .= LF.' }'.LF;
  159. return $res;
  160. }
  161. function _prepBehaviors($files) {
  162. $res = '';
  163. foreach ($files as $name) {
  164. $res .= '
  165. /**
  166. * '.$name.'Behavior
  167. *
  168. * @var '.$name.'Behavior
  169. */
  170. public $'.$name.';
  171. '.LF;
  172. }
  173. $res .= ' function __construct() {';
  174. foreach ($files as $name) {
  175. $res .= '
  176. $this->'.$name.' = new '.$name.'Behavior();';
  177. }
  178. $res .= LF.' }'.LF;
  179. return $res;
  180. }
  181. function _prepComponents($files) {
  182. $res = '';
  183. foreach ($files as $name) {
  184. $res .= '
  185. /**
  186. * '.$name.'Component
  187. *
  188. * @var '.$name.'Component
  189. */
  190. public $'.$name.';
  191. '.LF;
  192. }
  193. $res .= ' function __construct() {';
  194. foreach ($files as $name) {
  195. $res .= '
  196. $this->'.$name.' = new '.$name.'Component();';
  197. }
  198. $res .= LF.' }'.LF;
  199. return $res;
  200. }
  201. function _prepHelpers($files) {
  202. # new ones
  203. $res = '';
  204. foreach ($files as $name) {
  205. $res .= '
  206. /**
  207. * '.$name.'Helper
  208. *
  209. * @var '.$name.'Helper
  210. */
  211. public $'.$name.';
  212. '.LF;
  213. }
  214. $res .= ' function __construct() {';
  215. foreach ($files as $name) {
  216. $res .= '
  217. $this->'.$name.' = new '.$name.'Helper();';
  218. }
  219. /*
  220. foreach ($files as $name) {
  221. $res .= '
  222. $'.lcfirst($name).' = new '.$name.'Helper();
  223. ';
  224. }
  225. $res .= LF;
  226. */
  227. $res .= LF.' }'.LF;
  228. return $res;
  229. }
  230. function _dump() {
  231. $file = new File($this->filename, true);
  232. $content = '<?php exit();'.LF;
  233. $content .= '//Add in some helpers so the code assist works much better'.LF;
  234. $content .= '//Printed: '.date('d.m.Y, H:i:s').LF;
  235. $content .= '?>'.LF;
  236. $content .= $this->content;
  237. return $file->write($content);
  238. }
  239. }