2009-06-21 4 views
0
<py:match path="foo"> 
    <?python 
     import os 
     href = select('@href').render() 
     SOMEWHERE = ... # what file contained the foo tag? 
     path = os.path.abspath(os.path.join(os.path.dirname(SOMEWHERE), href) 
     f = file(path,'r') 
     # (do something interesting with f) 
    ?> 
</py:match> 
... 
<foo href="../path/relative/to/this/template/abcd.xyz"/> 

"어딘가"로 무엇을해야합니까? href 속성이 다른 태그의 href 속성과 같이 foo 태그가있는 파일에 상대적이어야합니다.genshi 템플릿에서 py : match와의 상대 경로 해석하기

또는 py : match 블록을 포함하는 파일은 무엇입니까? 이것은 foo 태그가있는 파일과 다른 디렉토리에있을 수 있기 때문에 덜 유용합니다.

덜 좋음 : Genshi 외부에서 컨텍스트 인수로 렌더링 할 파일의 경로를 제공 할 수 있지만 위의 두 디렉터리와 다른 디렉터리에있을 수 있습니다.

답변

1

foo 태그가 들어있는 파일의 디렉토리에서 드라이버 프로그램 (즉, 입력 파일을 구문 분석하는 Python 프로그램)이 실행되는지 확인해야합니다. 그렇지 않으면 상대 경로 (예 : 리더가 실행되는 디렉토리에서 읽는 파일의 디렉토리로 이동하는 방법)를 Python 코드의 컨텍스트 인수로 전달하고 os.path.join 명령에 추가해야합니다.

이 설정으로 (그리고 Fink 패키지 genshi-py26을 통해 MacOS X 10.6.3에 설치된 Genshi 0.6을 사용하여) os.getcwd() 명령은 foo 태그를 포함하는 파일의 현재 작업 디렉토리를 반환합니다.

이와 같은 복잡한 경로 구문의 경우 결과 HTML 코드에서 누설되는 것을 원하지 않을 수도 있으므로 path=os.path.normpath(path)을 사용하는 것이 좋습니다.

+0

필자가 기대하는 사람들에게 유용하지만 내 코드는 xi가있는 파일 A에서 Genshi를 실행할 수 있습니다. include href = "B/C/D"이고 D는 xi : include href = "../E"등, 내가 정말로하고 싶었던 것은 Genshi에서 E 또는 F의 위치에 대한 지식을 추출하는 것입니다 ... 이것은 Genshi에 패치를 적용하는 것과 관련이 있습니다. 비록 내가 질문을 한 후에 레일즈로 바꿨습니다. :-) –

+0

오, 알았어요. 'foo' 태그가있는 파일이 메인 파일이라면 위의 해결책은 실제로 문제를 해결할 것입니다 (어떤 이유로이 시나리오를 내재적으로 가정합니다. 그러나 실제로 당신의 질문을 따르지 않습니다 - 미안 해요!). 이것이 주 파일에 포함 된 또 다른 파일 인 경우, 드라이버 프로그램은 위치 및 원점을 알 수 없으며 올바른 경로를 포함 할 수 없습니다. 이 경우에는 문제의 해결책이 없습니다 (자신의 위치에 대해 알려주는 모든 * 파일의 시작 부분에 명백한 전역 상수가있는 것을 제외하고는 - 확실히 실현 가능하지 않음). – user8472

+0

나는 이미 파이썬을 사용하고 있었기 때문에 Genshi를 사용하고 있습니다. 지금까지 루비를 배우는 데 신경 쓰지는 않았지만, 레일즈가 실제로 시작해야 할 충분한 이유가 있다고 들었습니다. ^) – user8472