CcShell.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. <?php
  2. App::uses('AppShell', 'Console/Command');
  3. App::uses('Folder', 'Utility');
  4. App::uses('File', 'Utility');
  5. if (!defined('LF')) {
  6. define('LF', PHP_EOL); # use PHP to detect default linebreak
  7. }
  8. /**
  9. * Code Completion Shell
  10. * Workes perfectly with PHPDesigner - but should also work with most other IDEs out of the box
  11. *
  12. * @version 1.1
  13. * @cakephp 2.0
  14. * @author Mark Scherer
  15. * @license MIT
  16. * 2011-11-24 ms
  17. */
  18. class CcShell extends AppShell {
  19. public $uses = array();
  20. protected $plugins = null;
  21. protected $content = '';
  22. public function main() {
  23. $this->out('Code Completion Dump - customized for PHPDesigner');
  24. $this->filename = APP.'CodeCompletion.php';
  25. # get classes
  26. $this->models();
  27. $this->behaviors();
  28. $this->controller();
  29. $this->helpers();
  30. # write to file
  31. $this->_dump();
  32. $this->out('...done');
  33. }
  34. public function models() {
  35. $files = $this->_getFiles('Model');
  36. $content = LF;
  37. $content .= '/*** model start ***/'.LF;
  38. $content .= 'class AppModel extends Model {'.LF;
  39. if (!empty($files)) {
  40. $content .= $this->_prepModels($files);
  41. }
  42. $content .= '}'.LF;
  43. $content .= '/*** model end ***/'.LF;
  44. $this->content .= $content;
  45. }
  46. public function behaviors() {
  47. $files = $this->_getFiles('Model/Behavior');
  48. $content = LF;
  49. $content .= '/*** behavior start ***/'.LF;
  50. $content .= 'class AppModel extends Model {'.LF;
  51. if (!empty($files)) {
  52. $content .= $this->_prepBehaviors($files);
  53. }
  54. $content .= '}'.LF;
  55. $content .= '/*** behavior end ***/'.LF;
  56. $this->content .= $content;
  57. }
  58. /**
  59. * components + models
  60. */
  61. public function controller() {
  62. $content = LF;
  63. $content .= '/*** component start ***/'.LF;
  64. $content .= 'class AppController extends Controller {'.LF;
  65. $files = $this->_getFiles('Controller/Component');
  66. if (!empty($files)) {
  67. $content .= $this->_prepComponents($files);
  68. }
  69. $content .= LF.LF;
  70. $files = $this->_getFiles('Model');
  71. if (!empty($files)) {
  72. $content .= $this->_prepModels($files);
  73. }
  74. $content .= '}'.LF;
  75. $content .= '/*** component end ***/'.LF;
  76. $this->content .= $content;
  77. }
  78. public function helpers() {
  79. $files = $this->_getFiles('View/Helper');
  80. $content = LF;
  81. $content .= '/*** helper start ***/'.LF;
  82. $content .= 'class AppHelper extends Helper {'.LF;
  83. if (!empty($files)) {
  84. $content .= $this->_prepHelpers($files);
  85. }
  86. $content .= '}'.LF;
  87. $content .= '/*** helper end ***/'.LF;
  88. $this->content .= $content;
  89. }
  90. protected function _prepModels($files) {
  91. $res = '';
  92. foreach ($files as $name) {
  93. $res .= '
  94. /**
  95. * '.$name.'
  96. *
  97. * @var '.$name.'
  98. */
  99. public $'.$name.';
  100. '.LF;
  101. }
  102. $res .= ' public function __construct() {';
  103. foreach ($files as $name) {
  104. $res .= '
  105. $this->'.$name.' = new '.$name.'();';
  106. }
  107. $res .= LF.' }'.LF;
  108. return $res;
  109. }
  110. protected function _prepBehaviors($files) {
  111. $res = '';
  112. foreach ($files as $name) {
  113. if (!($varName = $this->_varName($name, 'Behavior'))) {
  114. continue;
  115. }
  116. $res .= '
  117. /**
  118. * '.$name.'Behavior
  119. *
  120. * @var '.$varName.'
  121. */
  122. public $'.$varName.';
  123. '.LF;
  124. }
  125. $res .= ' public function __construct() {';
  126. foreach ($files as $name) {
  127. if (!($varName = $this->_varName($name, 'Behavior'))) {
  128. continue;
  129. }
  130. $res .= '
  131. $this->'.$varName.' = new '.$name.'();';
  132. }
  133. $res .= LF.' }'.LF;
  134. return $res;
  135. }
  136. /**
  137. * check on correctness to avoid duplicates
  138. */
  139. protected function _varName($name, $type) {
  140. if (($pos = strrpos($name, $type)) === false) {
  141. return '';
  142. //return $name;
  143. }
  144. return substr($name, 0, $pos);
  145. }
  146. protected function _prepComponents($files) {
  147. $res = '';
  148. foreach ($files as $name) {
  149. if (!($varName = $this->_varName($name, 'Component'))) {
  150. continue;
  151. }
  152. $res .= '
  153. /**
  154. * '.$name.'
  155. *
  156. * @var '.$varName.'
  157. */
  158. public $'.$varName.';
  159. '.LF;
  160. }
  161. $res .= ' public function __construct() {';
  162. foreach ($files as $name) {
  163. if (!($varName = $this->_varName($name, 'Component'))) {
  164. continue;
  165. }
  166. $res .= '
  167. $this->'.$varName.' = new '.$name.'();';
  168. }
  169. $res .= LF.' }'.LF;
  170. return $res;
  171. }
  172. protected function _prepHelpers($files) {
  173. # new ones
  174. $res = '';
  175. foreach ($files as $name) {
  176. if (!($varName = $this->_varName($name, 'Helper'))) {
  177. continue;
  178. }
  179. $res .= '
  180. /**
  181. * '.$name.'
  182. *
  183. * @var '.$varName.'
  184. */
  185. public $'.$varName.';
  186. '.LF;
  187. }
  188. $res .= ' public function __construct() {';
  189. foreach ($files as $name) {
  190. if (!($varName = $this->_varName($name, 'Helper'))) {
  191. continue;
  192. }
  193. $res .= '
  194. $this->'.$varName.' = new '.$name.'();';
  195. }
  196. $res .= LF.' }'.LF;
  197. return $res;
  198. }
  199. protected function _dump() {
  200. //$File = new File($this->filename, true);
  201. $content = '<?php exit();'.PHP_EOL.PHP_EOL;
  202. $content .= 'class CodeCompletion {'.PHP_EOL;
  203. $content .= '}'.PHP_EOL.PHP_EOL;
  204. $content .= '//Printed: '.date('d.m.Y, H:i:s').PHP_EOL;
  205. $content .= $this->content;
  206. //return $File->write($content);
  207. file_put_contents($this->filename, $content);
  208. }
  209. protected function _getFiles($type) {
  210. $files = App::objects($type, null, false);
  211. $corePath = App::core($type);
  212. $coreFiles = App::objects($type, $corePath, false);
  213. $files = am($coreFiles, $files);
  214. //$paths = (array)App::path($type.'s');
  215. //$libFiles = App::objects($type, $paths[0] . 'lib' . DS, false);
  216. if (!isset($this->plugins)) {
  217. $this->plugins = App::objects('plugin');
  218. }
  219. if (!empty($this->plugins)) {
  220. foreach ($this->plugins as $plugin) {
  221. $pluginType = $plugin.'.'.$type;
  222. $pluginFiles = App::objects($pluginType, null, false);
  223. if (!empty($pluginFiles)) {
  224. foreach ($pluginFiles as $t) {
  225. $files[] = $t;
  226. }
  227. }
  228. }
  229. }
  230. $files = array_unique($files);
  231. sort($files);
  232. $appIndex = array_search('App', $files);
  233. if ($appIndex !== false) {
  234. unset($files[$appIndex]);
  235. }
  236. # no test/tmp files etc (helper.test.php or helper.OLD.php)
  237. foreach ($files as $key => $file) {
  238. if (strpos($file, '.') !== false || !preg_match('/^[\da-zA-Z_]+$/', $file)) {
  239. unset($files[$key]);
  240. }
  241. }
  242. return $files;
  243. }
  244. }