parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ответ

andylars 09.07.2017 13:22 / 09.07.2017 13:38

Искушенные веб-разработчики, в том или ином виде, приходят к схеме, в которой обрабатывают запрошенные урлы своим кодом, а не раскладывают код по физическим папкам на веб-сервере.
Примерная структура папок
----------------------------------

/engine      <- какая-то папка, где весь код/движок сайта на Парсере (файлы *.p)
/data        <- какие-то служебные данные для кода Парсера (например, *.dat)

/css         <- статические файлы
/i
/js
/..

.htaccess    <- конфиг для веб-сервера Apache 
                (точнее перекрытие директив основного конфига Апача)
                актуально для шаред-хостинга, где нет возможности прописать
                "включение Парсера" в основном конфиге веб-сервера.

auto.p       <- корневой (в корне веб-документов) который выполняет роль, например 
                конфига для всего сайта, задание каких-то глоб.переменных и проч.

_index.html  <- единственный .html файл, для "точки запуска".
                если нам нужно давать статические файлы, как документы с
                html с вёрсткой, то удобнее использовать для них расширение .htm,
                чтобы не пропускать через Парсер, например.



Примерное содержание файлов:
-------------------------------

--- .htaccess --- 
# назначаем обработчик для html
AddHandler parsed-html html
Action parsed-html /cgi-bin/parser3/parser3.cgi

# запрет на доступ к служебным файлам, и коду на Парсер
<Files ~ "\.(p|dat|dir|pag)$">
Order allow,deny
Deny from all
</Files>

# все запросы в урле
# которые не соответствуют реально существующему файлу на диске
# перенаправлять на _index.html
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /_index.html [QSA,L]

---/.htaccess ---


# DISCLAIMER: код ниже - не руководство к действию, а умозрительный пример


--- auto.p ---
# Тут может быть что-то типа конфига с глобальными переменными

$SITE_DOMAIN_DEFAULT[mysite.com]
$SITE_SOME_PARAM[...]
#...

# подключение каких-то классов
# хотя удобнее использовать @autouse или перечислить пути для классов
# в конфиге парсера

^use[/engine/...]


---/auto.p --- 





--- _index.html ---
# то, как выглядит точка запуска зависит уже от внутренней (объектной) архитектуры 
# для старта достаточного использовать единственный метод main, класса MAIN, 
# все остальное разложено по пользовательским классам (движка) и их методам

# например, как-то так:

@main[]
# создаем объект класса ("процесс сайта на движке")
$runtime[^Engine::create[]]
$result[^runtime.render[]]

---/_index.html ---



--- engine/Engine.p ---
# класс как основное тело процесса движка
@CLASS
Engine

@create[]

# создадим какое-то уже пред-подготовленное параметрическое окружение
# для передачи их дальше в подклассы
$Environ[      
   $.url[]             ^rem{# здесь уже может быть разобранный на части url) }
   $.form[]            ^rem{# здесь уже структурированные данные из форм }
   $.cookie[
     $.session[]
   ]
   $.some_var[]
]


# инициируем основные архитектурные подклассы, путем создания объектов
# и положим им в параметр ссылку на наш (внешний по отношению к ним)
# экземпляр Engine ($self - зарезервированное имя системной переменной), 
# чтобы подклассы смогли "общаться", как со своим родительским классом (Engine) 
# так и через него - друг с другом

$EModel[^Model::create[$self]]             ^rem{# создаем объект всей модели данных }
$EController[^Controller::create[$self]]   ^rem{# создаем объект контроллера }
$EView[^View::create[$self]]               ^rem{# создаем объект рендера результатов }

@render[]
...

--- /engine/Engine.p ---



--- engine/EModel.p ---
# класс модели (голых данных и логики)
@CLASS
EModel

@create[_parent_class]
$Engine[$_parent_class]  ^rem{# теперь мы можем дотянуться до родительского класса }


$Data[             ^rem{# какая то конечная структура/модель данных }
   $.user[
      $.id[^auth[$Engine.Environ.cookie.session]]
   ]
   $.sitemap[
      $.[/about][       
        $.title[
           $.ru[О компании]
           $.en[About Company]
        ]
      ]
   ]
#     ...                   
   $.some[]
]

@auth[]
...

--- /engine/EModel.p ---
Внутреннее устройство классов, под-классов, объектов и архитектура их взаимодействия,
полностью на воле разработчика, и подходы могут существенно отличаться.

Еще раз подчеркну, что пример выше написан, как умозрительный, и набросан буквально в тексте этого сообщения на форуме.