Понадобился. И оказалось, что SVG не умеет переносить текст! К счастью, в моём случае SVG создаётся при помощи python, а там не очень сложно написать функцию, разбивающую текст на строки длиной не больше заданного количества символов (главное, чтобы резала по пробелам):
def TextToLines(txt, maxLen):
result = []
lines0 = txt.split("\n") for line in lines0: chunks = line.split(" ") newline, l = "", 0 for chunk in chunks: if newline != "": l = 1 else: l = 0 if len(newline.decode("UTF-8")) + l + len(chunk.decode("UTF-8")) > maxLen: result.append(newline) newline = "" if newline != "": newline += " " newline += chunk if newline != "": result.append(newline)
return result
Соответственно, эта процедура применяется так:
textLines = TextToLines(мойТекст, 66) innerText, y = "", 15 for line in textLines: innerText += """<text x="10" y="%(y)d" font-size="10pt" fill="black">%(text)s</text>""" % {"text":line, "y":y} y += 15
Ну и дальше результат из innerText вставляем в нужное место формирующегося документа.
Не очень изящно, скажем прямо. Может, со временем найдется решение получше.
Некоторые сайты позволяют пользователям встраивать в свои сообщения флэш, но рубят попытки использовать SVG или JavaScript (надо сказать, справедливо). Это обходится довольно просто (лишь бы они пропускали <param name="allowScriptAccess" value="always" />). Итак:
1. Создаем флэш-ролик (для flex файл main.mxml может выглядеть примерно так):
3. Всё. Дальше в myscript.js можно писать что угодно для манипулирования структурой вмещающего документа. Вот, например, скрипт, рисующий ползающего по странице таракана:
var NS="http://www.w3.org/2000/svg"; var svg=document.createElementNS(NS,"svg"); svg.setAttribute("width",40); svg.setAttribute("height",40); svg.style.setProperty("position", "absolute", null); document.body.appendChild(svg);
var svgG = document.createElementNS(NS,"g"); svgG.setAttribute("transform","translate(20,20) rotate(120)"); svg.appendChild(svgG);
var el = document.createElementNS(NS,"ellipse"); el.setAttribute("style","fill:black"); el.setAttribute("cx",0); el.setAttribute("cy",0); el.setAttribute("rx",10); el.setAttribute("ry",4); svgG.appendChild(el);
var l111 = document.createElementNS(NS,"line");l111.setAttribute("style","stroke:black"); l111.setAttribute("x1",4);l111.setAttribute("y1",0);l111.setAttribute("x2",6);l111.setAttribute("y2",-6); svgG.appendChild(l111); var l112 = document.createElementNS(NS,"line");l112.setAttribute("style","stroke:black"); l112.setAttribute("x1",6);l112.setAttribute("y1",-6);l112.setAttribute("x2",2);l112.setAttribute("y2",-8); svgG.appendChild(l112);
var l211 = document.createElementNS(NS,"line");l211.setAttribute("style","stroke:black"); l211.setAttribute("x1",0);l211.setAttribute("y1",0);l211.setAttribute("x2",2);l211.setAttribute("y2",-6); svgG.appendChild(l211); var l212 = document.createElementNS(NS,"line");l212.setAttribute("style","stroke:black"); l212.setAttribute("x1",2);l212.setAttribute("y1",-6);l212.setAttribute("x2",-2);l212.setAttribute("y2",-8); svgG.appendChild(l212);
var l311 = document.createElementNS(NS,"line");l311.setAttribute("style","stroke:black"); l311.setAttribute("x1",-4);l311.setAttribute("y1",0);l311.setAttribute("x2",-2);l311.setAttribute("y2",-6); svgG.appendChild(l311); var l312 = document.createElementNS(NS,"line");l312.setAttribute("style","stroke:black"); l312.setAttribute("x1",-2);l312.setAttribute("y1",-6);l312.setAttribute("x2",-6);l312.setAttribute("y2",-8); svgG.appendChild(l312);
var l121 = document.createElementNS(NS,"line");l121.setAttribute("style","stroke:black"); l121.setAttribute("x1",4);l121.setAttribute("y1",0);l121.setAttribute("x2",6);l121.setAttribute("y2",6); svgG.appendChild(l121); var l122 = document.createElementNS(NS,"line");l122.setAttribute("style","stroke:black"); l122.setAttribute("x1",6);l122.setAttribute("y1",6);l122.setAttribute("x2",2);l122.setAttribute("y2",8); svgG.appendChild(l122);
var l221 = document.createElementNS(NS,"line");l221.setAttribute("style","stroke:black"); l221.setAttribute("x1",0);l221.setAttribute("y1",0);l221.setAttribute("x2",2);l221.setAttribute("y2",6); svgG.appendChild(l221); var l222 = document.createElementNS(NS,"line");l222.setAttribute("style","stroke:black"); l222.setAttribute("x1",2);l222.setAttribute("y1",6);l222.setAttribute("x2",-2);l222.setAttribute("y2",8); svgG.appendChild(l222);
var l321 = document.createElementNS(NS,"line");l321.setAttribute("style","stroke:black"); l321.setAttribute("x1",-4);l321.setAttribute("y1",0);l321.setAttribute("x2",-2);l321.setAttribute("y2",6); svgG.appendChild(l321); var l322 = document.createElementNS(NS,"line");l322.setAttribute("style","stroke:black"); l322.setAttribute("x1",-2);l322.setAttribute("y1",6);l322.setAttribute("x2",-6);l322.setAttribute("y2",8); svgG.appendChild(l322);
el = document.createElementNS(NS,"line");el.setAttribute("style","stroke:black"); el.setAttribute("x1",8);el.setAttribute("y1",0);el.setAttribute("x2",20);el.setAttribute("y2",-4); svgG.appendChild(el); el = document.createElementNS(NS,"line");el.setAttribute("style","stroke:black"); el.setAttribute("x1",8);el.setAttribute("y1",0);el.setAttribute("x2",20);el.setAttribute("y2",4); svgG.appendChild(el);
var legPosition = 0;
function placeLegs() { if (legPosition == 0) { l111.setAttribute("x2",6); l112.setAttribute("x1",6); l211.setAttribute("x2",2); l212.setAttribute("x1",2); l311.setAttribute("x2",-2); l312.setAttribute("x1",-2);
Ну не удается мне запомнить, что называется, "в лоб" эту японскую азбуку. Возникла мысль сделать какую-нибудь простенькую игрушку, чтобы, так сказать, в танце и песне овладеть этими неправославными знаками. Фигушки, всё равно не помогло. Зато слегка научился работать с flex 8-)
Windows Installer ругался, по-видимому, из-за того, что когда-то профиль пользователя перенесли на другой диск. Вот тут сказано прошерстить реестр на предмет кривых путей до папки "Мои документы". Кривой путь нашелся в ветке реестра: HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders Пришлось его там поправить, а потом перезапустить процесс explorer.exe
Попалась хорошая статья. Вкратце - обнулить параметр Compact Check Count реестра: HKEY_CURRENT_USER\Identities\{GUID}\Software\Microsoft\Outlook Express\5.0\ (он инкрементируется при каждом закрытии почтовика и по достижении значения 100 начинает выдавать это сообщение)
На самом деле всё подробно расписано здесь. Я даже сподобился написать простенький таймер ^_^
Оказалось, что эти самые гаджеты в простейшем случае представляют из себя обычные приложения html. Это самое приложение зазиповано в архив (только расширение у этого архива - не .zip, а .gadget) В архиве должен быть файл gadget.xml примерно такого вида:
Поразительный факт: подкупающие своей привычностью функции mssql_connect, mssql_query и т.п. канули в небытие начиная с версии 5.3.0, по крайней мере в варианте для windows.
Однако, как выяснилось, Microsoft в беде не оставит! Есть вполне работоспособный драйвер версии аж 2.0.1. Для него, правда, требуется нативный клиент SQL Server 2008, но его тоже легко можно скачать по ссылке вот с этой страницы (если, конечно, удастся нужную ссылку на этой странице отыскать ^_^).
Единственная тонкость: драйвер представляет из себя набор dll-ек "на все случаи жизни", и требуется выбрать из них нужную. Перебором получилось прописать в php.ini, закинув предварительно в папку расширений соответствующий файл:
extension=php_pdo_sqlsrv_53_ts_vc9.dll
что, видимо намекает на то, что PHP 5.3.1 компилировался при помощи Visual C++ 9...
В общем, минимально рабочий код оказался таким (лёгкая вариация примера из хелповника, поставляемого вместе с драйвером):
/* Указываем параметры поключения: имя сервера, логин-пароль и базу. */ $serverName = "myserver.mydomain.ru"; $connectionInfo = array( "UID"=>"uid", "PWD"=>"pwd", "Database"=>"AdventureWorks");
/* Подключаемся к серверу используя аутентификацию SQL Server. */ $conn = sqlsrv_connect( $serverName, $connectionInfo); if( $conn === false ) { echo "Unable to connect."; die( print_r( sqlsrv_errors(), true)); }
/* Получаем результаты запроса и выводим их на экран (казалось бы). */ // $row = sqlsrv_fetch_array($stmt); // echo "Server date: ".$row[0]; // не проканало с ошибкой Object of class DateTime could not be converted to string
/* Получаем результаты запроса и выводим их на экран - а вот так проканало. */ if (sqlsrv_fetch($stmt);) echo "Server date: ".sqlsrv_get_field( $stmt, 0, SQLSRV_PHPTYPE_STRING( SQLSRV_ENC_CHAR) );
/* Освобождаем ресурсы, выделенные для запроса и подключения. */ sqlsrv_free_stmt( $stmt); sqlsrv_close( $conn);
В первом приближении, правда, натолкнулся на ошибки, связанные с трудностью преобразования типа DateTime к строке (отсюда и закомментированный код), но начало положено...